aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-08-07 01:28:29 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2006-08-07 01:28:29 +0000
commit082e3cd6bff3bc55a90c08656a258944ce713ad9 (patch)
treea12f5d71bd11b0599592e54c257d642243e487b2
parent929c72e1917ce1f14598c971a16e96df79673cc3 (diff)
Fix a crash reported to me by hads on IRC. This crash would occur with the use
of the "distinctiveringaftercid" option. Also, on this user's system, the crash would only occur when built without optimizations. This is because the bug is that the code would write past the end of an array that was allocated on the stack, and the structure of the stack is different with or without optimizations enabled. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.2@39081 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r--channels/chan_zap.c20
1 files changed, 10 insertions, 10 deletions
diff --git a/channels/chan_zap.c b/channels/chan_zap.c
index aea308534..e0822f5e6 100644
--- a/channels/chan_zap.c
+++ b/channels/chan_zap.c
@@ -760,8 +760,6 @@ static struct zt_ring_cadence cadences[NUM_CADENCE_MAX] = {
{ { 1000, 500, 2500, 5000 } }, /*!< Long ring */
};
-int receivedRingT; /*!< Used to find out what ringtone we are on */
-
/*! \brief cidrings says in which pause to transmit the cid information, where the first pause
* is 1, the second pause is 2 and so on.
*/
@@ -5946,9 +5944,8 @@ static void *ss_thread(void *data)
len = 0;
distMatches = 0;
/* Clear the current ring data array so we dont have old data in it. */
- for (receivedRingT=0; receivedRingT < 3; receivedRingT++) {
+ for (receivedRingT=0; receivedRingT < (sizeof(curRingData) / sizeof(curRingData[0])); receivedRingT++)
curRingData[receivedRingT] = 0;
- }
receivedRingT = 0;
counter = 0;
counter1 = 0;
@@ -5976,8 +5973,10 @@ static void *ss_thread(void *data)
if (p->ringt < p->ringt_base/2)
break;
- ++receivedRingT; /* Increment the ringT counter so we can match it against
- values in zapata.conf for distinctive ring */
+ /* Increment the ringT counter so we can match it against
+ values in zapata.conf for distinctive ring */
+ if (++receivedRingT == (sizeof(curRingData) / sizeof(curRingData[0])))
+ break;
} else if (i & ZT_IOMUX_READ) {
res = read(p->subs[index].zfd, buf, sizeof(buf));
if (res < 0) {
@@ -6048,9 +6047,8 @@ static void *ss_thread(void *data)
len = 0;
distMatches = 0;
/* Clear the current ring data array so we dont have old data in it. */
- for (receivedRingT=0; receivedRingT < 3; receivedRingT++) {
+ for (receivedRingT=0; receivedRingT < (sizeof(curRingData) / sizeof(curRingData[0])); receivedRingT++)
curRingData[receivedRingT] = 0;
- }
receivedRingT = 0;
counter = 0;
counter1 = 0;
@@ -6080,8 +6078,10 @@ static void *ss_thread(void *data)
if (p->ringt < p->ringt_base/2)
break;
- ++receivedRingT; /* Increment the ringT counter so we can match it against
- values in zapata.conf for distinctive ring */
+ /* Increment the ringT counter so we can match it against
+ values in zapata.conf for distinctive ring */
+ if (++receivedRingT == (sizeof(curRingData) / sizeof(curRingData[0])))
+ break;
} else if (i & ZT_IOMUX_READ) {
res = read(p->subs[index].zfd, buf, sizeof(buf));
if (res < 0) {