diff options
author | Matthew Jordan <mjordan@digium.com> | 2013-02-25 12:51:24 +0000 |
---|---|---|
committer | Matthew Jordan <mjordan@digium.com> | 2013-02-25 12:51:24 +0000 |
commit | 9ad3e219c4aed1d41e6d3af0f2b5d115664920c5 (patch) | |
tree | eae635b1de81122cf6fdac9cbadd01b862ac656e /addons/res_config_mysql.c | |
parent | b34479ad37cf32f9b87c5de55ab12e9b5d7423d0 (diff) |
Clean up use of va_end/va_args in res_config_mysql
There were several problems using variadic argument macros in res_config_mysql.
* Improper use of va_end. Multiple calls to va_end were possible resulting in
an unbalanced matching of va_start/va_end.
* Calls to va_arg after a possible encounter of a SENTINEL value.
This patch corrects those errors.
(closes issue ASTERISK-19451)
Reported by: wdoekes
patches:
ASTERISK-19451-1.8--2.diff uploaded by wdoekes (License 5674)
........
Merged revisions 382021 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 382022 from http://svn.asterisk.org/svn/asterisk/branches/11
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@382023 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'addons/res_config_mysql.c')
-rw-r--r-- | addons/res_config_mysql.c | 27 |
1 files changed, 7 insertions, 20 deletions
diff --git a/addons/res_config_mysql.c b/addons/res_config_mysql.c index fe8b845e8..7b1f058ec 100644 --- a/addons/res_config_mysql.c +++ b/addons/res_config_mysql.c @@ -343,9 +343,7 @@ static struct ast_variable *realtime_mysql(const char *database, const char *tab } /* Get the first parameter and first value in our list of passed paramater/value pairs */ - newparam = va_arg(ap, const char *); - newval = va_arg(ap, const char *); - if (!newparam || !newval) { + if (!(newparam = va_arg(ap, const char *)) || !(newval = va_arg(ap, const char *))) { ast_log(LOG_WARNING, "MySQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n"); release_database(dbh); return NULL; @@ -376,7 +374,6 @@ static struct ast_variable *realtime_mysql(const char *database, const char *tab ESCAPE_STRING(buf, newval); ast_str_append(&sql, 0, " AND %s%s '%s'", newparam, op, ast_str_buffer(buf)); } - va_end(ap); ast_debug(1, "MySQL RealTime: Retrieve SQL: %s\n", ast_str_buffer(sql)); @@ -457,9 +454,7 @@ static struct ast_config *realtime_multi_mysql(const char *database, const char } /* Get the first parameter and first value in our list of passed paramater/value pairs */ - newparam = va_arg(ap, const char *); - newval = va_arg(ap, const char *); - if (!newparam || !newval) { + if (!(newparam = va_arg(ap, const char *)) || !(newval = va_arg(ap, const char *))) { ast_log(LOG_WARNING, "MySQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n"); ast_config_destroy(cfg); release_database(dbh); @@ -499,8 +494,6 @@ static struct ast_config *realtime_multi_mysql(const char *database, const char ast_str_append(&sql, 0, " ORDER BY %s", initfield); } - va_end(ap); - ast_debug(1, "MySQL RealTime: Retrieve SQL: %s\n", ast_str_buffer(sql)); /* Execution. */ @@ -581,9 +574,7 @@ static int update_mysql(const char *database, const char *tablename, const char } /* Get the first parameter and first value in our list of passed paramater/value pairs */ - newparam = va_arg(ap, const char *); - newval = va_arg(ap, const char *); - if (!newparam || !newval) { + if (!(newparam = va_arg(ap, const char *)) || !(newval = va_arg(ap, const char *))) { ast_log(LOG_WARNING, "MySQL RealTime: Realtime update requires at least 1 parameter and 1 value to update.\n"); release_table(table); release_database(dbh); @@ -633,7 +624,6 @@ static int update_mysql(const char *database, const char *tablename, const char internal_require(database, tablename, newparam, RQ_CHAR, ast_str_strlen(buf), SENTINEL); } } - va_end(ap); ESCAPE_STRING(buf, lookup); ast_str_append(&sql, 0, " WHERE `%s` = '%s'", keyfield, ast_str_buffer(buf)); @@ -667,7 +657,7 @@ static int update2_mysql(const char *database, const char *tablename, va_list ap { struct mysql_conn *dbh; my_ulonglong numrows; - int first = 1; + int first; const char *newparam, *newval; struct ast_str *sql = ast_str_thread_get(&sql_buf, 100), *buf = ast_str_thread_get(&scratch_buf, 100); struct ast_str *where = ast_str_thread_get(&sql2_buf, 100); @@ -706,6 +696,7 @@ static int update2_mysql(const char *database, const char *tablename, va_list ap return -1; } + first = 1; while ((newparam = va_arg(ap, const char *))) { if (!(column = find_column(table, newparam))) { ast_log(LOG_ERROR, "Updating on column '%s', but that column does not exist within the table '%s'!\n", newparam, tablename); @@ -753,7 +744,7 @@ static int update2_mysql(const char *database, const char *tablename, va_list ap internal_require(database, tablename, newparam, RQ_CHAR, ast_str_strlen(buf), SENTINEL); } } - va_end(ap); + release_table(table); ast_str_append(&sql, 0, " %s", ast_str_buffer(where)); @@ -802,9 +793,7 @@ static int store_mysql(const char *database, const char *table, va_list ap) return -1; } /* Get the first parameter and first value in our list of passed paramater/value pairs */ - newparam = va_arg(ap, const char *); - newval = va_arg(ap, const char *); - if (!newparam || !newval) { + if (!(newparam = va_arg(ap, const char *)) || !(newval = va_arg(ap, const char *))) { ast_log(LOG_WARNING, "MySQL RealTime: Realtime storage requires at least 1 parameter and 1 value to search on.\n"); release_database(dbh); return -1; @@ -833,7 +822,6 @@ static int store_mysql(const char *database, const char *table, va_list ap) ast_str_append(&sql2, 0, ", '%s'", ast_str_buffer(buf)); } } - va_end(ap); ast_str_append(&sql, 0, "%s)", ast_str_buffer(sql2)); ast_debug(1,"MySQL RealTime: Insert SQL: %s\n", ast_str_buffer(sql)); @@ -901,7 +889,6 @@ static int destroy_mysql(const char *database, const char *table, const char *ke ESCAPE_STRING(buf, newval); ast_str_append(&sql, 0, " AND `%s` = '%s'", newparam, ast_str_buffer(buf)); } - va_end(ap); ast_debug(1, "MySQL RealTime: Delete SQL: %s\n", ast_str_buffer(sql)); |