From be9d72b11d84747b802ba2ae45bf69b2d5cc8872 Mon Sep 17 00:00:00 2001
From: "Kevin P. Fleming" <kpfleming@digium.com>
Date: Mon, 11 Jul 2005 21:06:27 +0000
Subject: [PATCH] remove complex malloc-avoidance (bug #4601) remove resetting
 of variables during unload that will only be freed or set to known values on
 reload

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6085 65c4cc65-6c06-0410-ace0-fbb531ad65f3
---
 cdr/cdr_odbc.c  |  80 ++++++++-----------------
 cdr/cdr_pgsql.c | 154 ++++++++++++++++--------------------------------
 2 files changed, 75 insertions(+), 159 deletions(-)

diff --git a/cdr/cdr_odbc.c b/cdr/cdr_odbc.c
index 78971d4d09..c3f2a48ce1 100755
--- a/cdr/cdr_odbc.c
+++ b/cdr/cdr_odbc.c
@@ -40,7 +40,6 @@ static char *desc = "ODBC CDR Backend";
 static char *name = "ODBC";
 static char *config = "cdr_odbc.conf";
 static char *dsn = NULL, *username = NULL, *password = NULL, *table = NULL;
-static int dsn_alloc = 0, username_alloc = 0, password_alloc = 0, table_alloc = 0;
 static int loguniqueid = 0;
 static int usegmtime = 0;
 static int dispositionstring = 0;
@@ -191,39 +190,27 @@ static int odbc_unload_module(void)
 		SQLDisconnect(ODBC_con);
 		SQLFreeHandle(SQL_HANDLE_DBC, ODBC_con);
 		SQLFreeHandle(SQL_HANDLE_ENV, ODBC_env);
-		connected = 0;
 	}
-	if (dsn && dsn_alloc) {
+	if (dsn) {
 		if (option_verbose > 10)
 			ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free dsn\n");
 		free(dsn);
-		dsn = NULL;
-		dsn_alloc = 0;
 	}
-	if (username && username_alloc) {
+	if (username) {
 		if (option_verbose > 10)
 			ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free username\n");
 		free(username);
-		username = NULL;
-		username_alloc = 0;
 	}
-	if (password && password_alloc) {
+	if (password) {
 		if (option_verbose > 10)
 			ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free password\n");
 		free(password);
-		password = NULL;
-		password_alloc = 0;
 	}
-	if (table && table_alloc) {
+	if (table) {
 		if (option_verbose > 10)
 			ast_verbose( VERBOSE_PREFIX_4 "cdr_odbc: free table\n");
 		free(table);
-		table = NULL;
-		table_alloc = 0;
 	}
-	loguniqueid = 0;
-	usegmtime = 0;
-	dispositionstring = 0;
 
 	ast_cdr_unregister(name);
 	ast_mutex_unlock(&odbc_lock);
@@ -252,20 +239,15 @@ static int odbc_load_module(void)
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","dsn");
-	if (tmp) {
-		dsn = malloc(strlen(tmp) + 1);
-		if (dsn != NULL) {
-			memset(dsn, 0, strlen(tmp) + 1);
-			dsn_alloc = 1;
-			strncpy(dsn, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
-			res = -1;
-			goto out;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"cdr_odbc: dsn not specified.  Assuming asteriskdb\n");
-		dsn = "asteriskdb";
+		tmp = "asteriskdb";
+	}
+	dsn = strdup(tmp);
+	if (dsn == NULL) {
+		ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
+		res = -1;
+		goto out;
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","dispositionstring");
@@ -277,12 +259,8 @@ static int odbc_load_module(void)
 		
 	tmp = ast_variable_retrieve(cfg,"global","username");
 	if (tmp) {
-		username = malloc(strlen(tmp) + 1);
-		if (username != NULL) {
-			memset(username, 0, strlen(tmp) + 1);
-			username_alloc = 1;
-			strncpy(username, tmp, strlen(tmp));
-		} else {
+		username = strdup(tmp);
+		if (username == NULL) {
 			ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
 			res = -1;
 			goto out;
@@ -291,12 +269,8 @@ static int odbc_load_module(void)
 
 	tmp = ast_variable_retrieve(cfg,"global","password");
 	if (tmp) {
-		password = malloc(strlen(tmp) + 1);
-		if (password != NULL) {
-			memset(password, 0, strlen(tmp) + 1);
-			password_alloc = 1;
-			strncpy(password, tmp, strlen(tmp));
-		} else {
+		password = strdup(tmp);
+		if (password == NULL) {
 			ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
 			res = -1;
 			goto out;
@@ -330,20 +304,15 @@ static int odbc_load_module(void)
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","table");
-	if (tmp) {
-		table = malloc(strlen(tmp) + 1);
-		if (table != NULL) {
-			memset(table, 0, strlen(tmp) + 1);
-			table_alloc = 1;
-			strncpy(table, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
-			res = -1;
-			goto out;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"cdr_odbc: table not specified.  Assuming cdr\n");
-		table = "cdr";
+		tmp = "cdr";
+	}
+	table = strdup(tmp);
+	if (table == NULL) {
+		ast_log(LOG_ERROR,"cdr_odbc: Out of memory error.\n");
+		res = -1;
+		goto out;
 	}
 
 	ast_config_destroy(cfg);
@@ -437,6 +406,7 @@ static int odbc_init(void)
 		SQLSetConnectAttr(ODBC_con, SQL_LOGIN_TIMEOUT, (SQLPOINTER *)10, 0);	
 	}
 
+	/* XXX note username and password could be NULL here */
 	ODBC_res = SQLConnect(ODBC_con, (SQLCHAR*)dsn, SQL_NTS, (SQLCHAR*)username, SQL_NTS, (SQLCHAR*)password, SQL_NTS);
 
 	if ((ODBC_res != SQL_SUCCESS) && (ODBC_res != SQL_SUCCESS_WITH_INFO)) {
diff --git a/cdr/cdr_pgsql.c b/cdr/cdr_pgsql.c
index 99828ea30b..cfba0cb033 100755
--- a/cdr/cdr_pgsql.c
+++ b/cdr/cdr_pgsql.c
@@ -42,7 +42,6 @@ static char *desc = "PostgreSQL CDR Backend";
 static char *name = "pgsql";
 static char *config = "cdr_pgsql.conf";
 static char *pghostname = NULL, *pgdbname = NULL, *pgdbuser = NULL, *pgpassword = NULL, *pgdbsock = NULL, *pgdbport = NULL, *table = NULL;
-static int hostname_alloc = 0, dbname_alloc = 0, dbuser_alloc = 0, password_alloc = 0, dbsock_alloc = 0, dbport_alloc = 0, table_alloc = 0;
 static int connected = 0;
 
 AST_MUTEX_DEFINE_STATIC(pgsql_lock);
@@ -166,43 +165,20 @@ static int my_unload_module(void)
 { 
 	if (conn)
 		PQfinish(conn);
-	conn = NULL;
-	connected = 0;
-	if (pghostname && hostname_alloc) {
+	if (pghostname)
 		free(pghostname);
-		pghostname = NULL;
-		hostname_alloc = 0;
-	}
-	if (pgdbname && dbname_alloc) {
+	if (pgdbname)
 		free(pgdbname);
-		pgdbname = NULL;
-		dbname_alloc = 0;
-	}
-	if (pgdbuser && dbuser_alloc) {
+	if (pgdbuser)
 		free(pgdbuser);
-		pgdbuser = NULL;
-		dbuser_alloc = 0;
-	}
-	if (pgdbsock && dbsock_alloc) {
+	if (pgdbsock)
 		free(pgdbsock);
-		pgdbsock = NULL;
-		dbsock_alloc = 0;
-	}
-	if (pgpassword && password_alloc) {
+	if (pgpassword)
 		free(pgpassword);
-		pgpassword = NULL;
-		password_alloc = 0;
-	}
-	if (pgdbport && dbport_alloc) {
+	if (pgdbport)
 		free(pgdbport);
-		pgdbport = NULL;
-		dbport_alloc = 0;
-	}
-	if (table && table_alloc) {
+	if (table)
 		free(table);
-		table = NULL;
-		table_alloc = 0;
-	}
 	ast_cdr_unregister(name);
 	return 0;
 }
@@ -221,99 +197,69 @@ static int process_my_load_module(struct ast_config *cfg)
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","hostname");
-	if (tmp) {
-		pghostname = malloc(strlen(tmp) + 1);
-		if (pghostname != NULL) {
-			memset(pghostname, 0, strlen(tmp) + 1);
-			hostname_alloc = 1;
-			strncpy(pghostname, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"PostgreSQL server hostname not specified.  Assuming localhost\n");
-		pghostname = "localhost";
+		tmp = "localhost";
+	}
+	pghostname = strdup(tmp);
+	if (pghostname == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","dbname");
-	if (tmp) {
-		pgdbname = malloc(strlen(tmp) + 1);
-		if (pgdbname != NULL) {
-			memset(pgdbname, 0, strlen(tmp) + 1);
-			dbname_alloc = 1;
-			strncpy(pgdbname, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"PostgreSQL database not specified.  Assuming asterisk\n");
-		pgdbname = "asteriskcdrdb";
+		tmp = "asteriskcdrdb";
+	}
+	pgdbname = strdup(tmp);
+	if (pgdbname == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","user");
-	if (tmp) {
-		pgdbuser = malloc(strlen(tmp) + 1);
-		if (pgdbuser != NULL) {
-			memset(pgdbuser, 0, strlen(tmp) + 1);
-			dbuser_alloc = 1;
-			strncpy(pgdbuser, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"PostgreSQL database user not specified.  Assuming root\n");
-		pgdbuser = "root";
+		tmp = "root";
+	}
+	pgdbuser = strdup(tmp);
+	if (pgdbuser == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","password");
-	if (tmp) {
-		pgpassword = malloc(strlen(tmp) + 1);
-		if (pgpassword != NULL) {
-			memset(pgpassword, 0, strlen(tmp) + 1);
-			password_alloc = 1;
-			strncpy(pgpassword, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"PostgreSQL database password not specified.  Assuming blank\n");
-		pgpassword = "";
+		tmp = "";
+	}
+	pgpassword = strdup(tmp);
+	if (pgpassword == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
 
 	tmp = ast_variable_retrieve(cfg,"global","port");
-	if (tmp) {
-		pgdbport = malloc(strlen(tmp) + 1);
-		if (pgdbport != NULL) {
-			memset(pgdbport, 0, strlen(tmp) + 1);
-			dbport_alloc = 1;
-			strncpy(pgdbport, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"PostgreSQL database port not specified.  Using default 5432.\n");
-		pgdbport = "5432";
+		tmp = "5432";
+	}
+	pgdbport = strdup(tmp);
+	if (pgdbport == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
-        /* Loading stuff for table name */
+
 	tmp = ast_variable_retrieve(cfg,"global","table");
-	if (tmp) {
-		table = malloc(strlen(tmp) + 1);
-		if (table != NULL) {
-			memset(table, 0, strlen(tmp) + 1);
-			table_alloc = 1;
-			strncpy(table, tmp, strlen(tmp));
-		} else {
-			ast_log(LOG_ERROR,"Out of memory error.\n");
-			return -1;
-		}
-	} else {
+	if (tmp == NULL) {
 		ast_log(LOG_WARNING,"CDR table not specified.  Assuming cdr\n");
-		table = "cdr";
+		tmp = "cdr";
+	}
+	table = strdup(tmp);
+	if (table == NULL) {
+		ast_log(LOG_ERROR,"Out of memory error.\n");
+		return -1;
 	}
 
 	ast_log(LOG_DEBUG,"cdr_pgsql: got hostname of %s\n",pghostname);
-- 
GitLab