aboutsummaryrefslogtreecommitdiffstats
path: root/channels
diff options
context:
space:
mode:
authorrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-24 21:22:11 +0000
committerrmudgett <rmudgett@f38db490-d61c-443f-a65b-d21fe96a405b>2009-06-24 21:22:11 +0000
commit5a7a8e3d5f643346dac5136dae1d69245ddefbbe (patch)
treeb5910ead17205f47cd72157f4f15f7f367bfe4a5 /channels
parent7587dcbad07ab594961d32eed7ff521acdf8398a (diff)
Merged revisions 203037 via svnmerge from
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: http://svn.digium.com/svn/asterisk/branches/1.6.1@203057 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'channels')
-rw-r--r--channels/chan_dahdi.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 54dcff933..65eaaeb1e 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -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);