Fix regression with distinctive ring detection.

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
certified/1.8.6
Jeff Peeler 15 years ago
parent 6fa79e8f77
commit 58061391a1

@ -1728,7 +1728,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
{ {
unsigned char buf[256]; unsigned char buf[256];
int distMatches; int distMatches;
int curRingData[3]; int curRingData[RING_PATTERNS];
int receivedRingT; int receivedRingT;
int counter1; int counter1;
int counter; int counter;
@ -1749,7 +1749,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
* distinctive ringing */ * distinctive ringing */
if ((checkaftercid && distinctiveringaftercid) || !checkaftercid) { if ((checkaftercid && distinctiveringaftercid) || !checkaftercid) {
/* Clear the current ring data array so we don't have old data in it. */ /* 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; ringdata[receivedRingT] = 0;
receivedRingT = 0; receivedRingT = 0;
if (checkaftercid && distinctiveringaftercid) if (checkaftercid && distinctiveringaftercid)
@ -1783,7 +1783,7 @@ static int my_distinctive_ring(struct ast_channel *chan, void *pvt, int idx, int
break; break;
/* Increment the ringT counter so we can match it against /* Increment the ringT counter so we can match it against
values in chan_dahdi.conf for distinctive ring */ values in chan_dahdi.conf for distinctive ring */
if (++receivedRingT == ARRAY_LEN(ringdata)) if (++receivedRingT == RING_PATTERNS)
break; break;
} else if (i & DAHDI_IOMUX_READ) { } else if (i & DAHDI_IOMUX_READ) {
res = read(p->subs[idx].dfd, buf, sizeof(buf)); res = read(p->subs[idx].dfd, buf, sizeof(buf));

@ -2281,7 +2281,7 @@ static void *__analog_ss_thread(void *data)
int timeout = 10000; /* Ten seconds */ int timeout = 10000; /* Ten seconds */
struct timeval start = ast_tvnow(); struct timeval start = ast_tvnow();
enum analog_event ev; enum analog_event ev;
int curRingData[3] = { 0 }; int curRingData[RING_PATTERNS] = { 0 };
int receivedRingT = 0; int receivedRingT = 0;
namebuf[0] = 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 /* Increment the ringT counter so we can match it against
values in chan_dahdi.conf for distinctive ring */ values in chan_dahdi.conf for distinctive ring */
if (++receivedRingT == ARRAY_LEN(curRingData)) { if (++receivedRingT == RING_PATTERNS) {
break; break;
} }
} }

@ -28,6 +28,10 @@
#include "asterisk/channel.h" #include "asterisk/channel.h"
#include "asterisk/frame.h" #include "asterisk/frame.h"
#define ANALOG_MAX_CID 300
#define READ_SIZE 160
#define RING_PATTERNS 3
/* Signalling types supported */ /* Signalling types supported */
enum analog_sigtype { enum analog_sigtype {
ANALOG_SIG_NONE = -1, ANALOG_SIG_NONE = -1,
@ -110,8 +114,6 @@ enum analog_cid_start {
ANALOG_CID_START_DTMF_NOALERT, ANALOG_CID_START_DTMF_NOALERT,
}; };
#define ANALOG_MAX_CID 300
enum dialop { enum dialop {
ANALOG_DIAL_OP_REPLACE = 2, ANALOG_DIAL_OP_REPLACE = 2,
}; };
@ -221,8 +223,6 @@ struct analog_callback {
#define READ_SIZE 160
struct analog_subchannel { struct analog_subchannel {
struct ast_channel *owner; struct ast_channel *owner;
struct ast_frame f; /*!< One frame for each channel. How did this ever work before? */ struct ast_frame f; /*!< One frame for each channel. How did this ever work before? */

Loading…
Cancel
Save