From 564d73a5532d97b8f3e7c9d160e2e47592a33db7 Mon Sep 17 00:00:00 2001 From: John Ralls Date: Fri, 20 May 2022 14:33:29 -0700 Subject: [PATCH] Bug 798531 - Selecting "Print" from the file menu on a report... crashes gnucash Ensure that every call to gnc_prefs_get_string correctly handles both a NULL or empty string return value without crashing or leaking. --- gnucash/gnome-utils/gnc-plugin-file-history.c | 4 ++-- gnucash/gnome/dialog-print-check.c | 9 ++++----- gnucash/gnome/gnc-plugin-page-report.c | 15 ++++++++++++--- gnucash/import-export/aqb/gnc-plugin-aqbanking.c | 8 ++++---- libgnucash/app-utils/gnc-ui-util.c | 9 ++++++--- 5 files changed, 28 insertions(+), 17 deletions(-) diff --git a/gnucash/gnome-utils/gnc-plugin-file-history.c b/gnucash/gnome-utils/gnc-plugin-file-history.c index bf3e3600b4..b7ad7cec3f 100644 --- a/gnucash/gnome-utils/gnc-plugin-file-history.c +++ b/gnucash/gnome-utils/gnc-plugin-file-history.c @@ -197,15 +197,15 @@ gnc_history_add_file (const char *newfile) { from = gnc_history_index_to_pref_name(i); filename = gnc_prefs_get_string(GNC_PREFS_GROUP_HISTORY, from); - if (filename) + if (filename && *filename) { gnc_prefs_set_string(GNC_PREFS_GROUP_HISTORY, to, filename); - g_free(filename); } else { gnc_prefs_reset(GNC_PREFS_GROUP_HISTORY, to); } + g_free(filename); g_free(to); to = from; } diff --git a/gnucash/gnome/dialog-print-check.c b/gnucash/gnome/dialog-print-check.c index 1a3b65ddc8..c2b90da08e 100644 --- a/gnucash/gnome/dialog-print-check.c +++ b/gnucash/gnome/dialog-print-check.c @@ -606,13 +606,12 @@ gnc_ui_print_restore_dialog(PrintCheckDialog *pcd) /* Options page */ guid = gnc_prefs_get_string (GNC_PREFS_GROUP, GNC_PREF_CHECK_FORMAT_GUID); - if (guid == NULL) + if (!(guid && *guid)) gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), 0); else if (strcmp(guid, "custom") == 0) { gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), pcd->format_max - 1); - g_free (guid); } else { @@ -625,8 +624,8 @@ gnc_ui_print_restore_dialog(PrintCheckDialog *pcd) { gtk_combo_box_set_active(GTK_COMBO_BOX(pcd->format_combobox), 0); } - g_free (guid); } + g_free (guid); active = gnc_prefs_get_int(GNC_PREFS_GROUP, GNC_PREF_CHECK_POSITION); @@ -642,7 +641,7 @@ gnc_ui_print_restore_dialog(PrintCheckDialog *pcd) if (active == QOF_DATE_FORMAT_CUSTOM) { format = gnc_prefs_get_string (GNC_PREFS_GROUP, GNC_PREF_DATE_FORMAT_USER); - if (format) + if (format && *format) { gnc_date_format_set_custom(GNC_DATE_FORMAT(pcd->date_format), format); g_free(format); @@ -1701,7 +1700,7 @@ gnc_ui_print_check_dialog_create(GtkWidget *parent, /* Default font (set in preferences) */ font = gnc_prefs_get_string(GNC_PREFS_GROUP, GNC_PREF_DEFAULT_FONT); - pcd->default_font = font ? font : g_strdup(DEFAULT_FONT); + pcd->default_font = font && *font ? font : g_strdup(DEFAULT_FONT); /* Update the combo boxes bases on the available check formats */ initialize_format_combobox(pcd); diff --git a/gnucash/gnome/gnc-plugin-page-report.c b/gnucash/gnome/gnc-plugin-page-report.c index e8a37b0460..fea5c29c6b 100644 --- a/gnucash/gnome/gnc-plugin-page-report.c +++ b/gnucash/gnome/gnc-plugin-page-report.c @@ -1812,7 +1812,7 @@ static gchar *report_create_jobname(GncPluginPageReportPrivate *priv) char *format_code = gnc_prefs_get_string (GNC_PREFS_GROUP_REPORT_PDFEXPORT, GNC_PREF_FILENAME_DATE_FMT); const gchar *date_format_string; - if (*format_code == '\0') + if (!(format_code && *format_code)) { g_free(format_code); format_code = g_strdup("locale"); @@ -1872,8 +1872,17 @@ static gchar *report_create_jobname(GncPluginPageReportPrivate *priv) // Look up the sprintf format of the output name from the preferences database char* format = gnc_prefs_get_string(GNC_PREFS_GROUP_REPORT_PDFEXPORT, GNC_PREF_FILENAME_FMT); - job_name = g_strdup_printf(format, report_name, report_number, job_date); - + if (format && *format) + { + job_name = g_strdup_printf(format, report_name, + report_number, job_date); + } + else + { + PWARN("No GNC_PREF_FILENAME_FMT!"); + job_name = g_strdup_printf ("%s %s %s", report_name, + report_number, job_date); + } g_free(format); } g_free (report_name); diff --git a/gnucash/import-export/aqb/gnc-plugin-aqbanking.c b/gnucash/import-export/aqb/gnc-plugin-aqbanking.c index ad237fddd0..51592b796e 100644 --- a/gnucash/import-export/aqb/gnc-plugin-aqbanking.c +++ b/gnucash/import-export/aqb/gnc-plugin-aqbanking.c @@ -674,7 +674,7 @@ gnc_plugin_ab_cmd_mt940_import(GtkAction *action, GncMainWindowActionData *data) GNC_PREF_FORMAT_SWIFT940); gnc_main_window = data->window; gnc_file_aqbanking_import (GTK_WINDOW (gnc_main_window), - "swift", format ? format : "swift-mt940", FALSE); + "swift", format && *format ? format : "swift-mt940", FALSE); g_free(format); } @@ -685,7 +685,7 @@ gnc_plugin_ab_cmd_mt942_import(GtkAction *action, GncMainWindowActionData *data) GNC_PREF_FORMAT_SWIFT942); gnc_main_window = data->window; gnc_file_aqbanking_import (GTK_WINDOW (gnc_main_window), - "swift", format ? format : "swift-mt942", FALSE); + "swift", format && *format? format : "swift-mt942", FALSE); g_free(format); } @@ -696,7 +696,7 @@ gnc_plugin_ab_cmd_dtaus_import(GtkAction *action, GncMainWindowActionData *data) GNC_PREF_FORMAT_DTAUS); gnc_main_window = data->window; gnc_file_aqbanking_import (GTK_WINDOW (gnc_main_window), - "dtaus", format ? format : "default", FALSE); + "dtaus", format && *format ? format : "default", FALSE); g_free(format); } @@ -708,7 +708,7 @@ gnc_plugin_ab_cmd_dtaus_importsend(GtkAction *action, GNC_PREF_FORMAT_DTAUS); gnc_main_window = data->window; gnc_file_aqbanking_import (GTK_WINDOW (gnc_main_window), - "dtaus", format ? format : "default", TRUE); + "dtaus", format && *format ? format : "default", TRUE); g_free(format); } diff --git a/libgnucash/app-utils/gnc-ui-util.c b/libgnucash/app-utils/gnc-ui-util.c index d391bb3a9e..b31ab291d4 100644 --- a/libgnucash/app-utils/gnc-ui-util.c +++ b/libgnucash/app-utils/gnc-ui-util.c @@ -210,13 +210,15 @@ gnc_get_default_directory (const gchar *section) gchar *dir; dir = gnc_prefs_get_string (section, GNC_PREF_LAST_PATH); - if (!dir) + if (!(dir && *dir)) + { + g_free (dir); // if it's "" #ifdef G_OS_WIN32 dir = g_strdup (g_get_user_data_dir ()); /* equivalent of "My Documents" */ #else dir = g_strdup (g_get_home_dir ()); #endif - + } return dir; } @@ -1176,7 +1178,8 @@ gnc_default_currency_common (gchar *requested_currency, mnemonic = gnc_prefs_get_string(section, GNC_PREF_CURRENCY_OTHER); currency = gnc_commodity_table_lookup(gnc_get_current_commodities(), GNC_COMMODITY_NS_CURRENCY, mnemonic); - DEBUG("mnemonic %s, result %p", mnemonic ? mnemonic : "(null)", currency); + DEBUG("mnemonic %s, result %p", + mnemonic && *mnemonic ? mnemonic : "(null)", currency); g_free(mnemonic); }