]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 332816 via svnmerge from
authorRichard Mudgett <rmudgett@digium.com>
Mon, 22 Aug 2011 18:32:09 +0000 (18:32 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Mon, 22 Aug 2011 18:32:09 +0000 (18:32 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r332816 | rmudgett | 2011-08-22 13:14:59 -0500 (Mon, 22 Aug 2011) | 8 lines

  Memory leaks in realtime_multi_xxx() when database access returns error.

  * Fix realtime_multi_pgsql() configuration memory leak when the database
  access returns an error.

  * Fix realtime_multi_odbc() configuration category use after free when the
  database access returns an error.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@332830 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_config_odbc.c
res/res_config_pgsql.c

index 86cc25c86e586594f71e83927113362af7b31e36..fc2b8fa1b93b8b39f3842b716d9cb201ed030f70 100644 (file)
@@ -419,7 +419,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
                        if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
                                ast_log(LOG_WARNING, "SQL Describe Column error!\n[%s]\n\n", sql);
                                ast_category_destroy(cat);
-                               continue;
+                               goto next_sql_fetch;
                        }
 
                        indicator = 0;
@@ -430,7 +430,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
                        if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
                                ast_log(LOG_WARNING, "SQL Get Data error!\n[%s]\n\n", sql);
                                ast_category_destroy(cat);
-                               continue;
+                               goto next_sql_fetch;
                        }
                        stringp = rowdata;
                        while (stringp) {
@@ -448,6 +448,7 @@ static struct ast_config *realtime_multi_odbc(const char *database, const char *
                        }
                }
                ast_category_append(cfg, cat);
+next_sql_fetch:;
        }
 
        SQLFreeHandle(SQL_HANDLE_STMT, stmt);
index 6ed6bd294f22020921fc590db293c63408f9a46a..f8de8659634e9f2dc332b33917048100afdfeddc 100644 (file)
@@ -566,6 +566,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
                        PQfinish(pgsqlConn);
                        pgsqlConn = NULL;
                }
+               ast_config_destroy(cfg);
                return NULL;
        }
 
@@ -586,6 +587,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
        if (pgresult) {
                ast_log(LOG_ERROR, "PostgreSQL RealTime: detected invalid input: '%s'\n", newval);
                va_end(ap);
+               ast_config_destroy(cfg);
                return NULL;
        }
 
@@ -601,6 +603,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
                if (pgresult) {
                        ast_log(LOG_ERROR, "PostgreSQL RealTime: detected invalid input: '%s'\n", newval);
                        va_end(ap);
+                       ast_config_destroy(cfg);
                        return NULL;
                }
 
@@ -616,8 +619,9 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
        /* We now have our complete statement; Lets connect to the server and execute it. */
        ast_mutex_lock(&pgsql_lock);
 
-        if (pgsql_exec(database, table, ast_str_buffer(sql), &result) != 0) {
+       if (pgsql_exec(database, table, ast_str_buffer(sql), &result) != 0) {
                ast_mutex_unlock(&pgsql_lock);
+               ast_config_destroy(cfg);
                return NULL;
        } else {
                ExecStatusType result_status = PQresultStatus(result);
@@ -631,6 +635,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
                                                PQresultErrorMessage(result), PQresStatus(result_status));
                        PQclear(result);
                        ast_mutex_unlock(&pgsql_lock);
+                       ast_config_destroy(cfg);
                        return NULL;
                }
        }
@@ -648,6 +653,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
                if (!(fieldnames = ast_calloc(1, numFields * sizeof(char *)))) {
                        PQclear(result);
                        ast_mutex_unlock(&pgsql_lock);
+                       ast_config_destroy(cfg);
                        return NULL;
                }
                for (i = 0; i < numFields; i++)