mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 02:37:10 +00:00 
			
		
		
		
	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/1.8@332816 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -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); | ||||
|   | ||||
| @@ -474,6 +474,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char | ||||
| 			PQfinish(pgsqlConn); | ||||
| 			pgsqlConn = NULL; | ||||
| 		} | ||||
| 		ast_config_destroy(cfg); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| @@ -494,6 +495,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char | ||||
| 	if (pgresult) { | ||||
| 		ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", newval); | ||||
| 		va_end(ap); | ||||
| 		ast_config_destroy(cfg); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| @@ -509,6 +511,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char | ||||
| 		if (pgresult) { | ||||
| 			ast_log(LOG_ERROR, "Postgres detected invalid input: '%s'\n", newval); | ||||
| 			va_end(ap); | ||||
| 			ast_config_destroy(cfg); | ||||
| 			return NULL; | ||||
| 		} | ||||
|  | ||||
| @@ -525,6 +528,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char | ||||
| 	ast_mutex_lock(&pgsql_lock); | ||||
| 	if (!pgsql_reconnect(database)) { | ||||
| 		ast_mutex_unlock(&pgsql_lock); | ||||
| 		ast_config_destroy(cfg); | ||||
| 		return NULL; | ||||
| 	} | ||||
|  | ||||
| @@ -534,6 +538,7 @@ 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\n", PQerrorMessage(pgsqlConn)); | ||||
| 		ast_mutex_unlock(&pgsql_lock); | ||||
| 		ast_config_destroy(cfg); | ||||
| 		return NULL; | ||||
| 	} else { | ||||
| 		ExecStatusType result_status = PQresultStatus(result); | ||||
| @@ -547,6 +552,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; | ||||
| 		} | ||||
| 	} | ||||
| @@ -564,6 +570,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++) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user