]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 203037 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Wed, 24 Jun 2009 21:22:11 +0000 (21:22 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 24 Jun 2009 21:22:11 +0000 (21:22 +0000)
https://origsvn.digium.com/svn/asterisk/trunk

................
  r203037 | rmudgett | 2009-06-24 16:08:55 -0500 (Wed, 24 Jun 2009) | 15 lines

  Merged revisions 203036 via svnmerge from
  https://origsvn.digium.com/svn/asterisk/branches/1.4

  ........
    r203036 | rmudgett | 2009-06-24 16:01:43 -0500 (Wed, 24 Jun 2009) | 8 lines

    Improved chan_dahdi.conf pritimer error checking.

    Valid format is: pritimer=timer_name,timer_value

    *  Fixed segfault if the ',' is missing.
    *  Completely check the range returned by pri_timer2idx() to prevent
    possible access outside array bounds.
  ........
................

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

channels/chan_dahdi.c

index 54dcff933deccbb0e2f3bfdb833ed021ce1b0421..65eaaeb1eb6eddff32e1b3baa41d8818a0ab9150 100644 (file)
@@ -14761,22 +14761,34 @@ static int process_dahdi(struct dahdi_chan_conf *confp, const char *cat, struct
 #endif
                        } else if (!strcasecmp(v->name, "pritimer")) {
 #ifdef PRI_GETSET_TIMERS
-                               char tmp[20], *timerc, *c = tmp;
-                               int timer, timeridx;
+                               char tmp[20];
+                               char *timerc;
+                               char *c;
+                               int timer;
+                               int timeridx;
+
                                ast_copy_string(tmp, v->value, sizeof(tmp));
+                               c = tmp;
                                timerc = strsep(&c, ",");
-                               if (timerc) {
+                               if (!ast_strlen_zero(timerc) && !ast_strlen_zero(c)) {
+                                       timeridx = pri_timer2idx(timerc);
                                        timer = atoi(c);
-                                       if (!timer)
-                                               ast_log(LOG_WARNING, "'%s' is not a valid value for an ISDN timer at line %d.\n", timerc, v->lineno);
-                                       else {
-                                               if ((timeridx = pri_timer2idx(timerc)) >= 0)
-                                                       pritimers[timeridx] = timer;
-                                               else
-                                                       ast_log(LOG_WARNING, "'%s' is not a valid ISDN timer at line %d.\n", timerc, v->lineno);
+                                       if (timeridx < 0 || PRI_MAX_TIMERS <= timeridx) {
+                                               ast_log(LOG_WARNING,
+                                                       "'%s' is not a valid ISDN timer at line %d.\n", timerc,
+                                                       v->lineno);
+                                       } else if (!timer) {
+                                               ast_log(LOG_WARNING,
+                                                       "'%s' is not a valid value for ISDN timer '%s' at line %d.\n",
+                                                       c, timerc, v->lineno);
+                                       } else {
+                                               pritimers[timeridx] = timer;
                                        }
-                               } else
-                                       ast_log(LOG_WARNING, "'%s' is not a valid ISDN timer configuration string at line %d.\n", v->value, v->lineno);
+                               } else {
+                                       ast_log(LOG_WARNING,
+                                               "'%s' is not a valid ISDN timer configuration string at line %d.\n",
+                                               v->value, v->lineno);
+                               }
 
                        } else if (!strcasecmp(v->name, "facilityenable")) {
                                confp->pri.facilityenable = ast_true(v->value);