From: Jonathan Rose Date: Fri, 24 Jan 2014 21:14:09 +0000 (+0000) Subject: res_config_pgsql: Fix a memory leak and use RAII_VAR for cleanup when practical X-Git-Tag: 11.9.0-rc1~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ab81490ebc83728aebb8f5c94e2c7f7213cf7768;p=thirdparty%2Fasterisk.git res_config_pgsql: Fix a memory leak and use RAII_VAR for cleanup when practical Review: https://reviewboard.asterisk.org/r/3141/ ........ Merged revisions 406360 from http://svn.asterisk.org/svn/asterisk/branches/1.8 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@406361 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/res/res_config_pgsql.c b/res/res_config_pgsql.c index 252e599d04..40e46d2d98 100644 --- a/res/res_config_pgsql.c +++ b/res/res_config_pgsql.c @@ -252,8 +252,8 @@ static struct tables *find_table(const char *database, const char *orig_tablenam struct columns *column; struct tables *table; struct ast_str *sql = ast_str_thread_get(&findtable_buf, 330); - PGresult *result; - int exec_result; + RAII_VAR(PGresult *, result, NULL, PQclear); + int exec_result; char *fname, *ftype, *flen, *fnotnull, *fdef; int i, rows; @@ -339,14 +339,12 @@ static struct tables *find_table(const char *database, const char *orig_tablenam ast_debug(1, "Query of table structure complete. Now retrieving results.\n"); if (exec_result != 0) { ast_log(LOG_ERROR, "Failed to query database columns for table %s\n", orig_tablename); - PQclear(result); AST_LIST_UNLOCK(&psql_tables); return NULL; } if (!(table = ast_calloc(1, sizeof(*table) + strlen(orig_tablename) + 1))) { ast_log(LOG_ERROR, "Unable to allocate memory for new table structure\n"); - PQclear(result); AST_LIST_UNLOCK(&psql_tables); return NULL; } @@ -365,7 +363,6 @@ static struct tables *find_table(const char *database, const char *orig_tablenam if (!(column = ast_calloc(1, sizeof(*column) + strlen(fname) + strlen(ftype) + 2))) { ast_log(LOG_ERROR, "Unable to allocate column element for %s, %s\n", orig_tablename, fname); - PQclear(result); destroy_table(table); AST_LIST_UNLOCK(&psql_tables); return NULL; @@ -395,7 +392,6 @@ static struct tables *find_table(const char *database, const char *orig_tablenam } AST_LIST_INSERT_TAIL(&table->columns, column, list); } - PQclear(result); AST_LIST_INSERT_TAIL(&psql_tables, table, list); ast_rwlock_rdlock(&table->lock); @@ -420,7 +416,7 @@ static struct columns *find_column(struct tables *t, const char *colname) static struct ast_variable *realtime_pgsql(const char *database, const char *tablename, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); int num_rows = 0, pgresult; struct ast_str *sql = ast_str_thread_get(&sql_buf, 100); struct ast_str *escapebuf = ast_str_thread_get(&escapebuf_buf, 100); @@ -485,7 +481,6 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab ast_mutex_lock(&pgsql_lock); if (pgsql_exec(database, tablename, ast_str_buffer(sql), &result) != 0) { - PQclear(result); ast_mutex_unlock(&pgsql_lock); return NULL; } @@ -501,7 +496,6 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab ast_debug(1, "PostgreSQL RealTime: Found %d rows.\n", num_rows); if (!(fieldnames = ast_calloc(1, numFields * sizeof(char *)))) { - PQclear(result); ast_mutex_unlock(&pgsql_lock); return NULL; } @@ -530,7 +524,6 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab ast_debug(1, "Postgresql RealTime: Could not find any rows in table %s@%s.\n", tablename, database); } - PQclear(result); ast_mutex_unlock(&pgsql_lock); return var; @@ -538,7 +531,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab static struct ast_config *realtime_multi_pgsql(const char *database, const char *table, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); int num_rows = 0, pgresult; struct ast_str *sql = ast_str_thread_get(&sql_buf, 100); struct ast_str *escapebuf = ast_str_thread_get(&escapebuf_buf, 100); @@ -639,7 +632,6 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char ast_debug(1, "PostgreSQL RealTime: Query: %s\n", ast_str_buffer(sql)); ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n", PQresultErrorMessage(result), PQresStatus(result_status)); - PQclear(result); ast_mutex_unlock(&pgsql_lock); ast_config_destroy(cfg); return NULL; @@ -657,7 +649,6 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char ast_debug(1, "PostgreSQL RealTime: Found %d rows.\n", num_rows); if (!(fieldnames = ast_calloc(1, numFields * sizeof(char *)))) { - PQclear(result); ast_mutex_unlock(&pgsql_lock); ast_config_destroy(cfg); return NULL; @@ -689,7 +680,6 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char ast_debug(1, "PostgreSQL RealTime: Could not find any rows in table %s.\n", table); } - PQclear(result); ast_mutex_unlock(&pgsql_lock); return cfg; @@ -698,7 +688,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char static int update_pgsql(const char *database, const char *tablename, const char *keyfield, const char *lookup, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); int numrows = 0, pgresult; const char *newparam, *newval; struct ast_str *sql = ast_str_thread_get(&sql_buf, 100); @@ -805,7 +795,6 @@ static int update_pgsql(const char *database, const char *tablename, const char ast_debug(1, "PostgreSQL RealTime: Query: %s\n", ast_str_buffer(sql)); ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n", PQresultErrorMessage(result), PQresStatus(result_status)); - PQclear(result); ast_mutex_unlock(&pgsql_lock); return -1; } @@ -830,7 +819,7 @@ static int update_pgsql(const char *database, const char *tablename, const char static int update2_pgsql(const char *database, const char *tablename, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); int numrows = 0, pgresult, first = 1; struct ast_str *escapebuf = ast_str_thread_get(&escapebuf_buf, 16); const char *newparam, *newval; @@ -945,7 +934,7 @@ static int update2_pgsql(const char *database, const char *tablename, va_list ap static int store_pgsql(const char *database, const char *table, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); Oid insertid; struct ast_str *buf = ast_str_thread_get(&escapebuf_buf, 256); struct ast_str *sql1 = ast_str_thread_get(&sql_buf, 256); @@ -1007,7 +996,6 @@ static int store_pgsql(const char *database, const char *table, va_list ap) } insertid = PQoidValue(result); - PQclear(result); ast_mutex_unlock(&pgsql_lock); ast_debug(1, "PostgreSQL RealTime: row inserted on table: %s, id: %u\n", table, insertid); @@ -1026,7 +1014,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap) static int destroy_pgsql(const char *database, const char *table, const char *keyfield, const char *lookup, va_list ap) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); int numrows = 0; int pgresult; struct ast_str *sql = ast_str_thread_get(&sql_buf, 256); @@ -1108,7 +1096,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table, const char *file, struct ast_config *cfg, struct ast_flags flags, const char *suggested_incl, const char *who_asked) { - PGresult *result = NULL; + RAII_VAR(PGresult *, result, NULL, PQclear); long num_rows; struct ast_variable *new_v; struct ast_category *cur_cat = NULL; @@ -1155,7 +1143,6 @@ static struct ast_config *config_pgsql(const char *database, const char *table, char *field_cat_metric = PQgetvalue(result, rowIndex, 3); if (!strcmp(field_var_name, "#include")) { if (!ast_config_internal_load(field_var_val, cfg, flags, "", who_asked)) { - PQclear(result); ast_mutex_unlock(&pgsql_lock); return NULL; } @@ -1178,7 +1165,6 @@ static struct ast_config *config_pgsql(const char *database, const char *table, "PostgreSQL RealTime: Could not find config '%s' in database.\n", file); } - PQclear(result); ast_mutex_unlock(&pgsql_lock); return cfg; @@ -1298,7 +1284,7 @@ static int require_pgsql(const char *database, const char *tablename, va_list ap ast_debug(1, "About to run ALTER query on table '%s' to add column '%s'\n", tablename, elm); if (pgsql_exec(database, tablename, ast_str_buffer(sql), &result) != 0) { - ast_mutex_unlock(&pgsql_lock); + ast_mutex_unlock(&pgsql_lock); return -1; }