aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xinclude/asterisk/utils.h18
-rwxr-xr-xres/res_config_odbc.c7
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)