From 329a2f7d4249c43e9baebd528b4ab3c3396d4e49 Mon Sep 17 00:00:00 2001 From: Richard Cohen Date: Thu, 2 Mar 2023 12:31:03 +0000 Subject: [PATCH] Guard against some possible null pointer dereferences Found by gcc 12 when compiling with "-O2 -Wnull-dereference" --- bindings/guile/gnc-kvp-guile.cpp | 4 ++-- gnucash/gnome-search/search-core-type.c | 4 +++- gnucash/gnome/gnc-plugin-page-owner-tree.c | 6 +++++- gnucash/report/gnc-report.cpp | 3 +++ libgnucash/app-utils/calculation/expression_parser.c | 7 +++++-- libgnucash/engine/gnc-date.cpp | 2 ++ libgnucash/engine/qofquery.cpp | 3 ++- 7 files changed, 22 insertions(+), 7 deletions(-) diff --git a/bindings/guile/gnc-kvp-guile.cpp b/bindings/guile/gnc-kvp-guile.cpp index d1e011c185..c199ac68d6 100644 --- a/bindings/guile/gnc-kvp-guile.cpp +++ b/bindings/guile/gnc-kvp-guile.cpp @@ -121,7 +121,7 @@ gnc_kvp_value_ptr_to_scm(KvpValue* val) case KvpValue::Type::GUID: { auto tempguid = val->get(); - return gnc_guid2scm(*tempguid); + return tempguid ? gnc_guid2scm(*tempguid) : SCM_BOOL_F; } break; case KvpValue::Type::FRAME: @@ -133,7 +133,7 @@ gnc_kvp_value_ptr_to_scm(KvpValue* val) auto val_scm { gnc_kvp_value_ptr_to_scm (iter.second) }; return scm_acons (key_scm, val_scm, rv); }; - return scm_reverse (std::accumulate (frame->begin(), frame->end(), SCM_EOL, acc)); + return frame ? scm_reverse (std::accumulate (frame->begin(), frame->end(), SCM_EOL, acc)) : SCM_BOOL_F; } break; case KvpValue::Type::GLIST: diff --git a/gnucash/gnome-search/search-core-type.c b/gnucash/gnome-search/search-core-type.c index 7d7ff38421..7ea04ab205 100644 --- a/gnucash/gnome-search/search-core-type.c +++ b/gnucash/gnome-search/search-core-type.c @@ -230,7 +230,9 @@ editable_enters (GNCSearchCoreType *fe) void gnc_search_core_register_type (const char *type_name, GNCSearchCoreNew fcn) { - g_return_if_fail (type_name || *type_name || fcn); + g_return_if_fail (type_name); + g_return_if_fail (*type_name); + g_return_if_fail (fcn); g_return_if_fail (typeTable); g_hash_table_insert (typeTable, (char *) type_name, (gpointer) fcn); diff --git a/gnucash/gnome/gnc-plugin-page-owner-tree.c b/gnucash/gnome/gnc-plugin-page-owner-tree.c index 80c4912f96..42d77ccdf6 100644 --- a/gnucash/gnome/gnc-plugin-page-owner-tree.c +++ b/gnucash/gnome/gnc-plugin-page-owner-tree.c @@ -932,7 +932,11 @@ static int build_owner_report (GncOwner *owner, Account *acc) args = scm_cons (SCM_BOOL_F, args); } - arg = SWIG_NewPointerObj(owner, SWIG_TypeQuery("_p__gncOwner"), 0); + swig_type_info * qtype = SWIG_TypeQuery("_p__gncOwner"); + g_return_val_if_fail (qtype, -1); + + arg = SWIG_NewPointerObj(owner, qtype, 0); + g_return_val_if_fail (arg != SCM_UNDEFINED, -1); args = scm_cons (arg, args); diff --git a/gnucash/report/gnc-report.cpp b/gnucash/report/gnc-report.cpp index 33b4aa8220..e7b933675c 100644 --- a/gnucash/report/gnc-report.cpp +++ b/gnucash/report/gnc-report.cpp @@ -411,6 +411,9 @@ gnc_get_optiondb_from_dispatcher(SCM dispatcher) else c_ptr = reinterpret_cast(SCM_CELL_WORD_1(smob)); } + else + return nullptr; + auto u_ptr{static_cast*>(c_ptr)}; return u_ptr->get(); } diff --git a/libgnucash/app-utils/calculation/expression_parser.c b/libgnucash/app-utils/calculation/expression_parser.c index 3115217c7b..1c0a1559f8 100644 --- a/libgnucash/app-utils/calculation/expression_parser.c +++ b/libgnucash/app-utils/calculation/expression_parser.c @@ -612,8 +612,11 @@ parse_string (var_store_ptr value, const char *string, parser_env_ptr pe) var_store_ptr val; val = pop (pe); - pe->negate_numeric (val->value); - push (val, pe); + if (val) + { + pe->negate_numeric (val->value); + push (val, pe); + } } } diff --git a/libgnucash/engine/gnc-date.cpp b/libgnucash/engine/gnc-date.cpp index adf2600e7d..a2bdea6319 100644 --- a/libgnucash/engine/gnc-date.cpp +++ b/libgnucash/engine/gnc-date.cpp @@ -731,6 +731,8 @@ qof_scan_date_internal (const char *buff, int *day, int *month, int *year, /* today's date */ gnc_time (&secs); now = gnc_localtime (&secs); + if (!now) + return FALSE; now_day = now->tm_mday; now_month = now->tm_mon + 1; now_year = now->tm_year + 1900; diff --git a/libgnucash/engine/qofquery.cpp b/libgnucash/engine/qofquery.cpp index a7f5b784d0..dacf105e05 100644 --- a/libgnucash/engine/qofquery.cpp +++ b/libgnucash/engine/qofquery.cpp @@ -1208,7 +1208,8 @@ qof_query_merge(QofQuery *q1, QofQuery *q2, QofQueryOp op) break; } - retval->search_for = search_for; + if (retval) + retval->search_for = search_for; return retval; }