]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Another round of parameter handling fixes (ftmod_{libpri,isdn,pritap})
authorStefan Knoblich <s.knoblich@axsentis.de>
Mon, 15 Nov 2010 11:33:58 +0000 (12:33 +0100)
committerStefan Knoblich <s.knoblich@axsentis.de>
Mon, 15 Nov 2010 11:33:58 +0000 (12:33 +0100)
ftmod_pritap: Abort before overflowing spanparameters array and initialize to all zero
ftmod_isdn:   Fix overflow check, skip over parameters without name or value, initialize spanparameters array to all zero.
ftmod_libpri: Skip over parameters without name or value, initialize spanparameters array to all zero and drop "i < 10" hardcoded check.

This should fix:
2010-11-15 09:24:34.609515 [ERR] ftmod_libpri.c:1741 Unknown parameter '', aborting configuration
2010-11-15 09:24:34.609515 [ERR] mod_freetdm.c:3080 Error configuring FreeTDM span BRI_1

Signed-off-by: Stefan Knoblich <s.knoblich@axsentis.de>
Reported-by: Ingmar Schraub <is@eseco.de>
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c
libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c

index aaddbf69f071ad3c57804faff5a6fefb2b27baa3..a410e4eac6daf0725cc55bda477b0455ff112584 100755 (executable)
@@ -2937,15 +2937,22 @@ static switch_status_t load_config(void)
                                continue;
                        }
 
-                       for (param = switch_xml_child(myspan, "param"); param && paramindex < 10; param = param->next) {
+                       memset(spanparameters, 0, sizeof(spanparameters));
+
+                       for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
                                char *var = (char *) switch_xml_attr_soft(param, "name");
                                char *val = (char *) switch_xml_attr_soft(param, "value");
 
-                               if (ftdm_array_len(spanparameters) == paramindex) {
+                               if (ftdm_array_len(spanparameters) - 1 == paramindex) {
                                        ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pri span '%s', ignoring everything after '%s'\n", name, var);
                                        break;
                                }
 
+                               if (ftdm_strlen_zero(var) || ftdm_strlen_zero(val)) {
+                                       ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with empty name or value\n");
+                                       continue;
+                               }
+
                                if (!strcasecmp(var, "context")) {
                                        context = val;
                                } else if (!strcasecmp(var, "dialplan")) {
@@ -2995,11 +3002,18 @@ static switch_status_t load_config(void)
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "span missing required attribute 'name'\n");
                                continue;
                        }
-                       
+
+                       memset(spanparameters, 0, sizeof(spanparameters));
+
                        for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
                                char *var = (char *) switch_xml_attr_soft(param, "name");
                                char *val = (char *) switch_xml_attr_soft(param, "value");
 
+                               if (ftdm_array_len(spanparameters) - 1 == paramindex) {
+                                       ftdm_log(FTDM_LOG_ERROR, "Too many parameters for pritap span '%s', ignoring everything after '%s'\n", name, var);
+                                       break;
+                               }
+
                                if (!strcasecmp(var, "context")) {
                                        context = val;
                                } else if (!strcasecmp(var, "dialplan")) {
@@ -3049,7 +3063,9 @@ static switch_status_t load_config(void)
                                continue;
                        }
 
-                       for (param = switch_xml_child(myspan, "param"); param && paramindex < 10; param = param->next) {
+                       memset(spanparameters, 0, sizeof(spanparameters));
+
+                       for (param = switch_xml_child(myspan, "param"); param; param = param->next) {
                                char *var = (char *) switch_xml_attr_soft(param, "name");
                                char *val = (char *) switch_xml_attr_soft(param, "value");
 
@@ -3058,6 +3074,11 @@ static switch_status_t load_config(void)
                                        break;
                                }
 
+                               if (ftdm_strlen_zero(var) || ftdm_strlen_zero(val)) {
+                                       ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with empty name or value\n");
+                                       continue;
+                               }
+
                                if (!strcasecmp(var, "context")) {
                                        context = val;
                                } else if (!strcasecmp(var, "dialplan")) {
index 1f90d486f37029582a38a859ed854d77c15fe8e1..491ef886fa755dd32f72cf5a6389f4d84c9388fe 100644 (file)
@@ -2667,7 +2667,12 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(isdn_configure_span)
                const char *var = ftdm_parameters[i].var;
                const char *val = ftdm_parameters[i].val;
 
-               if (!val) {
+               if (ftdm_strlen_zero(var)) {
+                       ftdm_log(FTDM_LOG_WARNING, "Skipping variable with no name\n");
+                       continue;
+               }
+
+               if (ftdm_strlen_zero(val)) {
                        ftdm_log(FTDM_LOG_ERROR, "Variable '%s' has no value\n", var);
                        return FTDM_FAIL;
                }
index 2d6623586a78730b18e8c038e7da3b1a1fbdcacb..21d667471761e5eb6b08f744c243304dde14530e 100644 (file)
@@ -1704,11 +1704,16 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_libpri_configure_span)
                return FTDM_FAIL;
        }
 
-       for (i = 0; i < 10 && ftdm_parameters[i].var; i++) {
+       for (i = 0; ftdm_parameters[i].var; i++) {
                const char *var = ftdm_parameters[i].var;
                const char *val = ftdm_parameters[i].val;
 
-               if (!val) {
+               if (ftdm_strlen_zero(var)) {
+                       ftdm_log(FTDM_LOG_WARNING, "Skipping parameter with no name\n");
+                       continue;
+               }
+
+               if (ftdm_strlen_zero(val)) {
                        ftdm_log(FTDM_LOG_ERROR, "Parameter '%s' has no value\n", var);
                        snprintf(span->last_error, sizeof(span->last_error), "Parameter [%s] has no value", var);
                        return FTDM_FAIL;