gnucash maint: Bug 797811 - GnuCash crashes with segfault when saving to mysql...
John Ralls
jralls at code.gnucash.org
Fri Jun 19 18:12:15 EDT 2020
Updated via https://github.com/Gnucash/gnucash/commit/50329df0 (commit)
from https://github.com/Gnucash/gnucash/commit/66c6e6ee (commit)
commit 50329df0827a49a24276e322a6218ff18b9a048d
Author: John Ralls <jralls at ceridwen.us>
Date: Fri Jun 19 15:08:58 2020 -0700
Bug 797811 - GnuCash crashes with segfault when saving to mysql...
when database already exists.
Crashed because of dereferencing GncSqlBackend::m_conn when it's nullptr
after the DB create failed. Protect all such dereferences.
diff --git a/libgnucash/backend/sql/gnc-sql-backend.cpp b/libgnucash/backend/sql/gnc-sql-backend.cpp
index 0788ea812..7fcca7f7a 100644
--- a/libgnucash/backend/sql/gnc-sql-backend.cpp
+++ b/libgnucash/backend/sql/gnc-sql-backend.cpp
@@ -72,6 +72,7 @@ static QofLogModule log_module = G_LOG_DOMAIN;
using StrVec = std::vector<std::string>;
+static std::string empty_string{};
static EntryVec version_table
{
gnc_sql_make_table_entry<CT_STRING>(
@@ -99,7 +100,7 @@ GncSqlBackend::connect(GncSqlConnection *conn) noexcept
GncSqlStatementPtr
GncSqlBackend::create_statement_from_sql(const std::string& str) const noexcept
{
- auto stmt = m_conn->create_statement_from_sql(str);
+ auto stmt = m_conn ? m_conn->create_statement_from_sql(str) : nullptr;
if (stmt == nullptr)
{
PERR ("SQL error: %s\n", str.c_str());
@@ -111,7 +112,7 @@ GncSqlBackend::create_statement_from_sql(const std::string& str) const noexcept
GncSqlResultPtr
GncSqlBackend::execute_select_statement(const GncSqlStatementPtr& stmt) const noexcept
{
- auto result = m_conn->execute_select_statement(stmt);
+ auto result = m_conn ? m_conn->execute_select_statement(stmt) : nullptr;
if (result == nullptr)
{
PERR ("SQL error: %s\n", stmt->to_sql());
@@ -123,7 +124,7 @@ GncSqlBackend::execute_select_statement(const GncSqlStatementPtr& stmt) const no
int
GncSqlBackend::execute_nonselect_statement(const GncSqlStatementPtr& stmt) const noexcept
{
- auto result = m_conn->execute_nonselect_statement(stmt);
+ int result = m_conn ? m_conn->execute_nonselect_statement(stmt) : -1;
if (result == -1)
{
PERR ("SQL error: %s\n", stmt->to_sql());
@@ -135,6 +136,9 @@ GncSqlBackend::execute_nonselect_statement(const GncSqlStatementPtr& stmt) const
std::string
GncSqlBackend::quote_string(const std::string& str) const noexcept
{
+ g_return_val_if_fail (m_conn != nullptr, empty_string);
+ if (!m_conn)
+ return empty_string;
return m_conn->quote_string(str);
}
@@ -142,8 +146,9 @@ bool
GncSqlBackend::create_table(const std::string& table_name,
const EntryVec& col_table) const noexcept
{
+ g_return_val_if_fail (m_conn != nullptr, false);
+
ColVec info_vec;
- gboolean ok = FALSE;
for (auto const& table_row : col_table)
{
@@ -167,6 +172,7 @@ GncSqlBackend::create_index(const std::string& index_name,
const std::string& table_name,
const EntryVec& col_table) const noexcept
{
+ g_return_val_if_fail (m_conn != nullptr, false);
return m_conn->create_index(index_name, table_name, col_table);
}
@@ -174,6 +180,8 @@ bool
GncSqlBackend::add_columns_to_table(const std::string& table_name,
const EntryVec& col_table) const noexcept
{
+ g_return_val_if_fail (m_conn != nullptr, false);
+
ColVec info_vec;
for (auto const& table_row : col_table)
@@ -451,6 +459,7 @@ void
GncSqlBackend::sync(QofBook* book)
{
g_return_if_fail (book != NULL);
+ g_return_if_fail (m_conn != nullptr);
reset_version_info();
ENTER ("book=%p, sql_be->book=%p", book, m_book);
@@ -560,6 +569,7 @@ GncSqlBackend::commit (QofInstance* inst)
gboolean is_infant;
g_return_if_fail (inst != NULL);
+ g_return_if_fail (m_conn != nullptr);
if (qof_book_is_readonly(m_book))
{
@@ -650,7 +660,7 @@ GncSqlBackend::commit (QofInstance* inst)
void
GncSqlBackend::init_version_info() noexcept
{
-
+ g_return_if_fail (m_conn != nullptr);
if (m_conn->does_table_exist (VERSION_TABLE_NAME))
{
std::string sql {"SELECT * FROM "};
Summary of changes:
libgnucash/backend/sql/gnc-sql-backend.cpp | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
More information about the gnucash-changes
mailing list