Skip to content
Snippets Groups Projects
Commit be9d72b1 authored by Kevin P. Fleming's avatar Kevin P. Fleming
Browse files

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
parent e24821e1
No related branches found
No related tags found
No related merge requests found
......@@ -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)) {
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment