[asterisk-commits] mjordan: trunk r375770 - in /trunk: ./ main/db.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Nov 3 20:19:46 CDT 2012


Author: mjordan
Date: Sat Nov  3 20:19:43 2012
New Revision: 375770

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=375770
Log:
Properly finalize prepared SQLite3 statements to prevent memory leak

The AstDB uses prepared SQLite3 statements to retrieve data from the SQLite3
database.  These statements should be finalized during Asterisk shutdown so
that the SQLite3 database can be properly closed.  Failure to finalize the
statements results in a memory leak and a failure when closing the database.

This patch fixes those issues by ensuring that all prepared statements are
properly finalized at shutdown.

(closes issue ASTERISK-20647)
Reported by: Corey Farrell
patches:
  astdb-sqlite3_close.patch uploaded by Corey Farrell (license 5909)
........

Merged revisions 375761 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 375763 from http://svn.asterisk.org/svn/asterisk/branches/11

Modified:
    trunk/   (props changed)
    trunk/main/db.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-11-merged' - no diff available.

Modified: trunk/main/db.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/db.c?view=diff&rev=375770&r1=375769&r2=375770
==============================================================================
--- trunk/main/db.c (original)
+++ trunk/main/db.c Sat Nov  3 20:19:43 2012
@@ -141,6 +141,36 @@
 	return 0;
 }
 
+/*! \internal
+ * \brief Clean up the prepared SQLite3 statement
+ * \note dblock should already be locked prior to calling this method
+ */
+static int clean_stmt(sqlite3_stmt *stmt, const char *sql)
+{
+	if (sqlite3_finalize(stmt) != SQLITE_OK) {
+		ast_log(LOG_WARNING, "Couldn't finalize statement '%s': %s\n", sql, sqlite3_errmsg(astdb));
+		return -1;
+	}
+	return 0;
+}
+
+/*! \internal
+ * \brief Clean up all prepared SQLite3 statements
+ * \note dblock should already be locked prior to calling this method
+ */
+static void clean_statements(void)
+{
+	clean_stmt(get_stmt, get_stmt_sql);
+	clean_stmt(del_stmt, del_stmt_sql);
+	clean_stmt(deltree_stmt, deltree_stmt_sql);
+	clean_stmt(deltree_all_stmt, deltree_all_stmt_sql);
+	clean_stmt(gettree_stmt, gettree_stmt_sql);
+	clean_stmt(gettree_all_stmt, gettree_all_stmt_sql);
+	clean_stmt(showkey_stmt, showkey_stmt_sql);
+	clean_stmt(put_stmt, put_stmt_sql);
+	clean_stmt(create_astdb_stmt, create_astdb_stmt_sql);
+}
+
 static int init_statements(void)
 {
 	/* Don't initialize create_astdb_statment here as the astdb table needs to exist
@@ -955,6 +985,7 @@
 /*! \internal \brief Clean up resources on Asterisk shutdown */
 static void astdb_atexit(void)
 {
+	ast_cli_unregister_multiple(cli_database, ARRAY_LEN(cli_database));
 	ast_manager_unregister("DBGet");
 	ast_manager_unregister("DBPut");
 	ast_manager_unregister("DBDel");
@@ -969,7 +1000,10 @@
 
 	pthread_join(syncthread, NULL);
 	ast_mutex_lock(&dblock);
-	sqlite3_close(astdb);
+	clean_statements();
+	if (sqlite3_close(astdb) == SQLITE_OK) {
+		astdb = NULL;
+	}
 	ast_mutex_unlock(&dblock);
 }
 




More information about the asterisk-commits mailing list