Bug 739584 - gnucash-2.6.4 segfaults regularly on transfer .

Ensure that xferData is nulled after free and that client functions check
for the NULL.
This commit is contained in:
John Ralls 2014-12-21 12:34:32 -08:00
parent a537ff052b
commit 745ff9e519

View File

@ -184,6 +184,7 @@ static gnc_numeric
gnc_xfer_dialog_compute_price (XferDialog *xferData) gnc_xfer_dialog_compute_price (XferDialog *xferData)
{ {
gnc_numeric from_amt, to_amt; gnc_numeric from_amt, to_amt;
g_return_val_if_fail (xferData != NULL, gnc_numeric_error (GNC_ERROR_ARG));
from_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit)); from_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->amount_edit));
to_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->to_amount_edit)); to_amt = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->to_amount_edit));
@ -353,6 +354,7 @@ gnc_xfer_dialog_curr_acct_activate(XferDialog *xferData)
Account *from_account; Account *from_account;
gboolean curr_active; gboolean curr_active;
g_return_if_fail (xferData != NULL);
from_account = from_account =
gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM); gnc_transfer_dialog_get_selected_account (xferData, XFER_DIALOG_FROM);
@ -395,6 +397,7 @@ void
price_amount_radio_toggled_cb(GtkToggleButton *togglebutton, gpointer data) price_amount_radio_toggled_cb(GtkToggleButton *togglebutton, gpointer data)
{ {
XferDialog *xferData = data; XferDialog *xferData = data;
g_return_if_fail (xferData != NULL);
gtk_widget_set_sensitive(xferData->price_edit, gtk_toggle_button_get_active gtk_widget_set_sensitive(xferData->price_edit, gtk_toggle_button_get_active
(GTK_TOGGLE_BUTTON(xferData->price_radio))); (GTK_TOGGLE_BUTTON(xferData->price_radio)));
@ -536,6 +539,7 @@ gnc_xfer_dialog_fill_tree_view(XferDialog *xferData,
AccountTreeFilterInfo *info; AccountTreeFilterInfo *info;
GtkBuilder *builder = g_object_get_data (G_OBJECT (xferData->dialog), "builder"); GtkBuilder *builder = g_object_get_data (G_OBJECT (xferData->dialog), "builder");
g_return_if_fail (xferData != NULL);
use_accounting_labels = gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL, use_accounting_labels = gnc_prefs_get_bool(GNC_PREFS_GROUP_GENERAL,
GNC_PREF_ACCOUNTING_LABELS); GNC_PREF_ACCOUNTING_LABELS);
@ -620,6 +624,7 @@ static void
gnc_parse_error_dialog (XferDialog *xferData, const char *error_string) gnc_parse_error_dialog (XferDialog *xferData, const char *error_string)
{ {
const char * parse_error_string; const char * parse_error_string;
g_return_if_fail (xferData != NULL);
parse_error_string = gnc_exp_parser_error_string (); parse_error_string = gnc_exp_parser_error_string ();
if (parse_error_string == NULL) if (parse_error_string == NULL)
@ -777,6 +782,8 @@ gnc_xfer_description_insert_cb(GtkEditable *editable,
const gchar *match_str; const gchar *match_str;
gint prefix_len, new_text_len, match_str_len; gint prefix_len, new_text_len, match_str_len;
g_return_if_fail (xferData != NULL);
if (insert_text_len <= 0) if (insert_text_len <= 0)
return; return;
@ -918,6 +925,7 @@ gnc_xfer_amount_update_cb(GtkWidget *widget, GdkEventFocus *event,
gpointer data) gpointer data)
{ {
XferDialog * xferData = data; XferDialog * xferData = data;
g_return_val_if_fail (xferData != NULL, FALSE);
gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->amount_edit)); gnc_amount_edit_evaluate (GNC_AMOUNT_EDIT (xferData->amount_edit));
@ -1363,6 +1371,7 @@ gnc_xfer_dialog_response_cb (GtkDialog *dialog, gint response, gpointer data)
Split *from_split; Split *from_split;
Split *to_split; Split *to_split;
g_return_if_fail (xferData != NULL);
ENTER(" "); ENTER(" ");
if (response == GTK_RESPONSE_APPLY) if (response == GTK_RESPONSE_APPLY)
@ -1695,6 +1704,7 @@ gnc_xfer_dialog_close_cb(GtkDialog *dialog, gpointer data)
g_source_remove (xferData->desc_selection_source_id); g_source_remove (xferData->desc_selection_source_id);
g_free(xferData); g_free(xferData);
xferData = NULL;
DEBUG("xfer dialog destroyed"); DEBUG("xfer dialog destroyed");
} }