aboutsummaryrefslogtreecommitdiffstats
path: root/res
diff options
context:
space:
mode:
authortilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-02 15:13:21 +0000
committertilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b>2008-10-02 15:13:21 +0000
commitd2a9932b6183473ff832dcbcab1f0592a5155870 (patch)
tree793b86f8faddf2376d7a7ce3e38e0ab0a0cafa1f /res
parent3ce8f891ee74bb3e746e98e2e8f4e94995179e60 (diff)
Some sanity checks that may have led to prior crashes, found by codefreeze-lap
(murf) on IRC. Also some cleanup of incorrectly-used constants. git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.4@145751 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'res')
-rw-r--r--res/res_odbc.c24
1 files changed, 15 insertions, 9 deletions
diff --git a/res/res_odbc.c b/res/res_odbc.c
index f87b9e2bd..b0fed02c9 100644
--- a/res/res_odbc.c
+++ b/res/res_odbc.c
@@ -486,17 +486,23 @@ static odbc_status odbc_obj_disconnect(struct odbc_obj *obj)
short int mlen;
unsigned char msg[200], stat[10];
+ /* Nothing to disconnect */
+ if (!obj->con) {
+ return ODBC_SUCCESS;
+ }
+
ast_mutex_lock(&obj->lock);
res = SQLDisconnect(obj->con);
- if (res == ODBC_SUCCESS) {
+ if (res == SQL_SUCCESS || res == SQL_SUCCESS_WITH_INFO) {
ast_log(LOG_DEBUG, "Disconnected %d from %s [%s]\n", res, obj->parent->name, obj->parent->dsn);
} else {
ast_log(LOG_DEBUG, "res_odbc: %s [%s] already disconnected\n", obj->parent->name, obj->parent->dsn);
}
- if ((res = SQLFreeHandle(SQL_HANDLE_DBC, obj->con) == ODBC_SUCCESS)) {
+ if ((res = SQLFreeHandle(SQL_HANDLE_DBC, obj->con) == SQL_SUCCESS)) {
+ obj->con = NULL;
ast_log(LOG_DEBUG, "Database handle deallocated\n");
} else {
SQLGetDiagRec(SQL_HANDLE_DBC, obj->con, 1, stat, &err, msg, 100, &mlen);
@@ -520,6 +526,13 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
#endif
ast_mutex_lock(&obj->lock);
+ if (obj->up) {
+ odbc_obj_disconnect(obj);
+ ast_log(LOG_NOTICE, "Re-connecting %s\n", obj->parent->name);
+ } else {
+ ast_log(LOG_NOTICE, "Connecting %s\n", obj->parent->name);
+ }
+
res = SQLAllocHandle(SQL_HANDLE_DBC, obj->parent->env, &obj->con);
if ((res != SQL_SUCCESS) && (res != SQL_SUCCESS_WITH_INFO)) {
@@ -534,13 +547,6 @@ static odbc_status odbc_obj_connect(struct odbc_obj *obj)
SQLSetConnectAttr(obj->con, SQL_ATTR_TRACEFILE, tracefile, strlen(tracefile));
#endif
- if (obj->up) {
- odbc_obj_disconnect(obj);
- ast_log(LOG_NOTICE, "Re-connecting %s\n", obj->parent->name);
- } else {
- ast_log(LOG_NOTICE, "Connecting %s\n", obj->parent->name);
- }
-
res = SQLConnect(obj->con,
(SQLCHAR *) obj->parent->dsn, SQL_NTS,
(SQLCHAR *) obj->parent->username, SQL_NTS,