]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Catch invalid extensions at the parser, instead of making the core deal with them.
authorTilghman Lesher <tilghman@meg.abyt.es>
Tue, 7 Sep 2010 20:30:22 +0000 (20:30 +0000)
committerTilghman Lesher <tilghman@meg.abyt.es>
Tue, 7 Sep 2010 20:30:22 +0000 (20:30 +0000)
(closes issue #17794)
 Reported by: PavelL
 Patches:
       20100820__issue17794__1.6.2.diff.txt uploaded by tilghman (license 14)
       20100820__issue17794__1.4.diff.txt uploaded by tilghman (license 14)
 Tested by: PavelL

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

pbx/pbx_config.c

index 0bcdf78117a8de36321ea07ba2c2cacd4adba05f..ea374daf36972fa2b3e332c82e8fdc286e1536c4 100644 (file)
@@ -2211,8 +2211,11 @@ static int pbx_load_config(const char *config_file)
                                        char *pri, *appl, *data, *cidmatch;
                                        char *stringp = tc;
                                        char *ext = strsep(&stringp, ",");
-                                       if (!ext)
-                                               ext="";
+                                       if (!ext) {
+                                               ast_log(LOG_WARNING, "Bogus extension at line %d\n", v->lineno);
+                                               ast_free(tc);
+                                               continue;
+                                       }
                                        pbx_substitute_variables_helper(NULL, ext, realext, sizeof(realext) - 1);
                                        cidmatch = strchr(realext, '/');
                                        if (cidmatch) {
@@ -2220,8 +2223,11 @@ static int pbx_load_config(const char *config_file)
                                                ast_shrink_phone_number(cidmatch);
                                        }
                                        pri = strsep(&stringp, ",");
-                                       if (!pri)
-                                               pri="";
+                                       if (!pri) {
+                                               ast_log(LOG_WARNING, "Bogus extension at line %d\n", v->lineno);
+                                               ast_free(tc);
+                                               continue;
+                                       }
                                        pri = ast_skip_blanks(pri);
                                        pri = ast_trim_blanks(pri);
                                        label = strchr(pri, '(');
@@ -2234,26 +2240,39 @@ static int pbx_load_config(const char *config_file)
                                                        ast_log(LOG_WARNING, "Label missing trailing ')' at line %d\n", v->lineno);
                                        }
                                        plus = strchr(pri, '+');
-                                       if (plus)
+                                       if (plus) {
                                                *plus++ = '\0';
-                                       if (!strcmp(pri,"hint"))
-                                               ipri=PRIORITY_HINT;
-                                       else if (!strcmp(pri, "next") || !strcmp(pri, "n")) {
-                                               if (lastpri > -2)
+                                       }
+                                       if (!strcmp(pri, "hint")) {
+                                               ipri = PRIORITY_HINT;
+                                       } else if (!strcmp(pri, "next") || !strcmp(pri, "n")) {
+                                               if (lastpri > -2) {
                                                        ipri = lastpri + 1;
-                                               else
-                                                       ast_log(LOG_WARNING, "Can't use 'next' priority on the first entry!\n");
+                                               } else {
+                                                       ast_log(LOG_WARNING, "Can't use 'next' priority on the first entry at line %d!\n", v->lineno);
+                                                       ast_free(tc);
+                                                       continue;
+                                               }
                                        } else if (!strcmp(pri, "same") || !strcmp(pri, "s")) {
-                                               if (lastpri > -2)
+                                               if (lastpri > -2) {
                                                        ipri = lastpri;
-                                               else
-                                                       ast_log(LOG_WARNING, "Can't use 'same' priority on the first entry!\n");
+                                               } else {
+                                                       ast_log(LOG_WARNING, "Can't use 'same' priority on the first entry at line %d!\n", v->lineno);
+                                                       ast_free(tc);
+                                                       continue;
+                                               }
                                        } else if (sscanf(pri, "%30d", &ipri) != 1 &&
                                            (ipri = ast_findlabel_extension2(NULL, con, realext, pri, cidmatch)) < 1) {
                                                ast_log(LOG_WARNING, "Invalid priority/label '%s' at line %d\n", pri, v->lineno);
                                                ipri = 0;
+                                               ast_free(tc);
+                                               continue;
+                                       }
+                                       if (ast_strlen_zero(appl = S_OR(stringp, ""))) {
+                                               ast_log(LOG_WARNING, "Bogus extension at line %d\n", v->lineno);
+                                               ast_free(tc);
+                                               continue;
                                        }
-                                       appl = S_OR(stringp, "");
                                        /* Find the first occurrence of either '(' or ',' */
                                        firstc = strchr(appl, ',');
                                        firstp = strchr(appl, '(');