From 57e2f2262cd89f502f7a801b8ee7796e454a5e75 Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Wed, 28 Mar 2018 15:41:52 -0400 Subject: Fixed potential database prepared statements memory leak Prepared statements have to be wrapped in the unique_ptr type before throwing an exception. --- hkutil/database.h | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'hkutil/database.h') diff --git a/hkutil/database.h b/hkutil/database.h index 0914047..619ba86 100644 --- a/hkutil/database.h +++ b/hkutil/database.h @@ -113,18 +113,20 @@ namespace hatkirby { { sqlite3_stmt* tempStmt; - if (sqlite3_prepare_v2( + int ret = sqlite3_prepare_v2( ppdb_.get(), query.c_str(), query.length(), &tempStmt, - NULL) != SQLITE_OK) + NULL); + + ppstmt_type ppstmt(tempStmt); + + if (ret != SQLITE_OK) { throw sqlite3_error("Error writing to database", ppdb_.get()); } - ppstmt_type ppstmt(tempStmt); - if (sqlite3_step(ppstmt.get()) != SQLITE_DONE) { throw sqlite3_error("Error writing to database", ppdb_.get()); @@ -157,18 +159,20 @@ namespace hatkirby { sqlite3_stmt* tempStmt; - if (sqlite3_prepare_v2( + int ret = sqlite3_prepare_v2( ppdb_.get(), query_str.c_str(), query_str.length(), &tempStmt, - NULL) != SQLITE_OK) + NULL); + + ppstmt_type ppstmt(tempStmt); + + if (ret != SQLITE_OK) { throw sqlite3_error("Error writing to database", ppdb_.get()); } - ppstmt_type ppstmt(tempStmt); - int i = 1; for (const column& c : columns) { @@ -191,18 +195,20 @@ namespace hatkirby { { sqlite3_stmt* tempStmt; - if (sqlite3_prepare_v2( + int ret = sqlite3_prepare_v2( ppdb_.get(), queryString.c_str(), queryString.length(), &tempStmt, - NULL) != SQLITE_OK) + NULL); + + ppstmt_type ppstmt(tempStmt); + + if (ret != SQLITE_OK) { throw sqlite3_error("Error preparing query", ppdb_.get()); } - ppstmt_type ppstmt(tempStmt); - int i = 1; for (const binding& value : bindings) { -- cgit 1.4.1