Fix regression with distinctive ring detection.
authorJeff Peeler <jpeeler@digium.com>
Mon, 19 Jul 2010 14:39:07 +0000 (14:39 +0000)
committerJeff Peeler <jpeeler@digium.com>
Mon, 19 Jul 2010 14:39:07 +0000 (14:39 +0000)
The issue here is that passing an array to a function prohibits the ARRAY_LEN
macro from returning the real size. To avoid this the size is now defined and
use of ARRAY_LEN is avoided.

(closes issue #15718)
Reported by: alecdavis
Patches:
      bug15718.patch uploaded by jpeeler (license 325)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@277837 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_analog.c
channels/sig_analog.h

index f94f93d..333da60 100644 (file)
@@ -1728,7 +1728,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
 {
        unsigned char buf[256];
        int distMatches;
-       int curRingData[3];
+       int curRingData[RING_PATTERNS];
        int receivedRingT;
        int counter1;
        int counter;
@@ -1749,7 +1749,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
         * distinctive ringing */
        if ((checkaftercid && distinctiveringaftercid) || !checkaftercid) {
                /* Clear the current ring data array so we don't have old data in it. */
-               for (receivedRingT = 0; receivedRingT < ARRAY_LEN(ringdata); receivedRingT++)
+               for (receivedRingT = 0; receivedRingT < RING_PATTERNS; receivedRingT++)
                        ringdata[receivedRingT] = 0;
                receivedRingT = 0;
                if (checkaftercid && distinctiveringaftercid)
@@ -1783,7 +1783,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
                                        break;
                                /* Increment the ringT counter so we can match it against
                                   values in chan_dahdi.conf for distinctive ring */
-                               if (++receivedRingT == ARRAY_LEN(ringdata))
+                               if (++receivedRingT == RING_PATTERNS)
                                        break;
                        } else if (i & DAHDI_IOMUX_READ) {
                                res = read(p->subs[idx].dfd, buf, sizeof(buf));
index 6054458..1e84e27 100644 (file)
@@ -2281,7 +2281,7 @@ static void *__analog_ss_thread(void *data)
                        int timeout = 10000;  /* Ten seconds */
                        struct timeval start = ast_tvnow();
                        enum analog_event ev;
-                       int curRingData[3] = { 0 };
+                       int curRingData[RING_PATTERNS] = { 0 };
                        int receivedRingT = 0;
 
                        namebuf[0] = 0;
@@ -2315,7 +2315,7 @@ static void *__analog_ss_thread(void *data)
                                                        }
                                                        /* Increment the ringT counter so we can match it against
                                                           values in chan_dahdi.conf for distinctive ring */
-                                                       if (++receivedRingT == ARRAY_LEN(curRingData)) {
+                                                       if (++receivedRingT == RING_PATTERNS) {
                                                                break;
                                                        }
                                                }
index 3f75e58..e7f1ae2 100644 (file)
 #include "asterisk/channel.h"
 #include "asterisk/frame.h"
 
+#define ANALOG_MAX_CID 300
+#define READ_SIZE 160
+#define RING_PATTERNS 3
+
 /* Signalling types supported */
 enum analog_sigtype {
        ANALOG_SIG_NONE = -1,
@@ -110,8 +114,6 @@ enum analog_cid_start {
        ANALOG_CID_START_DTMF_NOALERT,
 };
 
-#define ANALOG_MAX_CID 300
-
 enum dialop {
        ANALOG_DIAL_OP_REPLACE = 2,
 };
@@ -221,8 +223,6 @@ struct analog_callback {
 
 
 
-#define READ_SIZE 160
-
 struct analog_subchannel {
        struct ast_channel *owner;
        struct ast_frame f;             /*!< One frame for each channel.  How did this ever work before? */