res_config_sqlite: Check for CDR unregistration failures
authorMatthew Jordan <mjordan@digium.com>
Sun, 8 Dec 2013 05:59:46 +0000 (05:59 +0000)
committerMatthew Jordan <mjordan@digium.com>
Sun, 8 Dec 2013 05:59:46 +0000 (05:59 +0000)
If the CDR unregistration fails due to an inflight CDR, the
res_config_sqlite module needs to bail on unloading itself. Otherwise,
the config could be unloaded (including the CDR table name) while the
CDR engine posts a CDR to the still registered backend, resulting in
a crash.
........

Merged revisions 403435 from http://svn.asterisk.org/svn/asterisk/branches/12

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@403436 65c4cc65-6c06-0410-ace0-fbb531ad65f3

res/res_config_sqlite.c

index 7d5fd83..143f4ea 100644 (file)
@@ -1627,11 +1627,13 @@ static char *handle_cli_sqlite_show_tables(struct ast_cli_entry *e, int cmd, str
 
 static int unload_module(void)
 {
-       if (cli_status_registered)
-               ast_cli_unregister_multiple(cli_status, ARRAY_LEN(cli_status));
+       if (cdr_registered && ast_cdr_unregister(RES_CONFIG_SQLITE_NAME)) {
+               return -1;
+       }
 
-       if (cdr_registered)
-               ast_cdr_unregister(RES_CONFIG_SQLITE_NAME);
+       if (cli_status_registered) {
+               ast_cli_unregister_multiple(cli_status, ARRAY_LEN(cli_status));
+       }
 
        ast_config_engine_deregister(&sqlite_engine);