]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix a crash reported to me by hads on IRC. This crash would occur with the use
authorRussell Bryant <russell@russellbryant.com>
Mon, 7 Aug 2006 01:28:29 +0000 (01:28 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 7 Aug 2006 01:28:29 +0000 (01:28 +0000)
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: https://origsvn.digium.com/svn/asterisk/branches/1.2@39081 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index aea3085349a895d988a0ef2bf4bbcac647b944d8..e0822f5e6359618bb96b87c619b823970d02ac35 100644 (file)
@@ -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) {