diff options
Diffstat (limited to 'res')
-rw-r--r-- | res/res_odbc.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/res/res_odbc.c b/res/res_odbc.c index 18c64c9a3..d58864da0 100644 --- a/res/res_odbc.c +++ b/res/res_odbc.c @@ -697,15 +697,19 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) ast_mutex_init(&obj->lock); /* obj inherits the outstanding reference to class */ obj->parent = class; + class = NULL; if (odbc_obj_connect(obj) == ODBC_FAIL) { ast_log(LOG_WARNING, "Failed to connect to %s\n", name); ao2_ref(obj, -1); obj = NULL; - class->count--; } else { obj->used = 1; ao2_link(class->obj_container, obj); } + } else { + /* Object is not constructed, so delete outstanding reference to class. */ + ao2_ref(class, -1); + class = NULL; } } else { /* Non-pooled connection: multiple modules can use the same connection. */ @@ -715,7 +719,11 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) break; } - if (!obj) { + if (obj) { + /* Object is not constructed, so delete outstanding reference to class. */ + ao2_ref(class, -1); + class = NULL; + } else { /* No entry: build one */ obj = ao2_alloc(sizeof(*obj), odbc_obj_destructor); if (!obj) { @@ -725,6 +733,7 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) ast_mutex_init(&obj->lock); /* obj inherits the outstanding reference to class */ obj->parent = class; + class = NULL; if (odbc_obj_connect(obj) == ODBC_FAIL) { ast_log(LOG_WARNING, "Failed to connect to %s\n", name); ao2_ref(obj, -1); @@ -747,8 +756,8 @@ struct odbc_obj *ast_odbc_request_obj(const char *name, int check) obj->lineno = lineno; } #endif + ast_assert(class == NULL); - ao2_ref(class, -1); return obj; } |