diff options
-rwxr-xr-x | include/asterisk/utils.h | 18 | ||||
-rwxr-xr-x | res/res_config_odbc.c | 7 |
2 files changed, 23 insertions, 2 deletions
diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index dd1141985..0669c08a0 100755 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -134,6 +134,24 @@ extern int test_for_thread_safety(void); extern const char *ast_inet_ntoa(char *buf, int bufsiz, struct in_addr ia); extern int ast_utils_init(void); +/* The realloca lets us ast_restrdupa(), but you can't mix any other ast_strdup calls! */ + +struct ast_realloca { + char *ptr; + int alloclen; +}; + +#define ast_restrdupa(ra, s) \ + ({ \ + if ((ra)->ptr && strlen(s) + 1 < (ra)->alloclen) { \ + strcpy((ra)->ptr, s); \ + } else { \ + (ra)->ptr = alloca(strlen(s) + 1 - (ra)->alloclen); \ + if ((ra)->ptr) (ra)->alloclen = strlen(s) + 1; \ + } \ + (ra)->ptr; \ + }) + #ifdef inet_ntoa #undef inet_ntoa #endif diff --git a/res/res_config_odbc.c b/res/res_config_odbc.c index 2a27c06a2..f8813de7f 100755 --- a/res/res_config_odbc.c +++ b/res/res_config_odbc.c @@ -186,19 +186,21 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * struct ast_variable *var=NULL, *prev=NULL; struct ast_config *cfg=NULL; struct ast_category *cat=NULL; + struct ast_realloca ra; SQLLEN rowcount=0; SQLULEN colsize; SQLSMALLINT colcount=0; SQLSMALLINT datatype; SQLSMALLINT decimaldigits; SQLSMALLINT nullable; + va_list aq; - va_copy(aq, ap); if (!table) return NULL; + memset(&ra, 0, sizeof(ra)); obj = fetch_odbc_obj(database); if (!obj) @@ -269,6 +271,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * while (rowcount--) { var = NULL; prev = NULL; + title = NULL; res = SQLFetch(stmt); if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) { ast_log(LOG_WARNING, "SQL Fetch error!\n[%s]\n\n", sql); @@ -297,7 +300,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char * chunk = strsep(&stringp, ";"); if (chunk && !ast_strlen_zero(ast_strip(chunk))) { if (initfield && !strcmp(initfield, coltitle) && !title) - title = ast_strdupa(chunk); + title = ast_restrdupa(&ra, chunk); if (prev) { prev->next = ast_new_variable(coltitle, chunk); if (prev->next) |