From ced7c9ae43af218f2e02bf44032916498f7b90ab Mon Sep 17 00:00:00 2001 From: Stefan Knoblich Date: Mon, 15 Nov 2010 12:33:58 +0100 Subject: [PATCH] freetdm: Another round of parameter handling fixes (ftmod_{libpri,isdn,pritap}) 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 Reported-by: Ingmar Schraub --- libs/freetdm/mod_freetdm/mod_freetdm.c | 29 ++++++++++++++++--- .../freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c | 7 ++++- .../src/ftmod/ftmod_libpri/ftmod_libpri.c | 9 ++++-- 3 files changed, 38 insertions(+), 7 deletions(-) diff --git a/libs/freetdm/mod_freetdm/mod_freetdm.c b/libs/freetdm/mod_freetdm/mod_freetdm.c index aaddbf69f0..a410e4eac6 100755 --- a/libs/freetdm/mod_freetdm/mod_freetdm.c +++ b/libs/freetdm/mod_freetdm/mod_freetdm.c @@ -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")) { diff --git a/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c index 1f90d486f3..491ef886fa 100644 --- a/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c +++ b/libs/freetdm/src/ftmod/ftmod_isdn/ftmod_isdn.c @@ -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; } diff --git a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c index 2d6623586a..21d6674717 100644 --- a/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c +++ b/libs/freetdm/src/ftmod/ftmod_libpri/ftmod_libpri.c @@ -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;