r23356 - gnucash/trunk/src - Bug 710979 - Crash in gnc_plugin_page_invoice_summarybar_position_changed

Geert Janssens gjanssens at code.gnucash.org
Wed Oct 30 10:43:59 EDT 2013


Author: gjanssens
Date: 2013-10-30 10:43:58 -0400 (Wed, 30 Oct 2013)
New Revision: 23356
Trac: http://svn.gnucash.org/trac/changeset/23356

Modified:
   gnucash/trunk/src/app-utils/gnc-gsettings.c
   gnucash/trunk/src/business/business-gnome/gnc-plugin-page-invoice.c
Log:
Bug 710979 - Crash in gnc_plugin_page_invoice_summarybar_position_changed

Signal handlers didn't get removed properly from gsettings keys
when an invoice page was closed, leading to a crash if the
signal handler is later activated again.

Modified: gnucash/trunk/src/app-utils/gnc-gsettings.c
===================================================================
--- gnucash/trunk/src/app-utils/gnc-gsettings.c	2013-10-29 20:53:21 UTC (rev 23355)
+++ gnucash/trunk/src/app-utils/gnc-gsettings.c	2013-10-30 14:43:58 UTC (rev 23356)
@@ -192,30 +192,26 @@
 {
     gint matched = 0;
     gchar *signal = NULL;
+    GQuark quark = 0;
 
     GSettings *schema_ptr = gnc_gsettings_get_schema_ptr (schema);
     g_return_if_fail (G_IS_SETTINGS (schema_ptr));
     g_return_if_fail (func);
 
-    if ((!key) || (*key == '\0'))
-        signal = g_strdup ("changed");
-    else
-    {
-        if (gnc_gsettings_is_valid_key(schema_ptr, key))
-            signal = g_strconcat ("changed::", key, NULL);
-    }
+    ENTER ();
 
+    if ((key) && (gnc_gsettings_is_valid_key(schema_ptr, key)))
+        quark = g_quark_from_string (key);
+
     matched = g_signal_handlers_disconnect_matched (
             schema_ptr,
             G_SIGNAL_MATCH_DETAIL | G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA,
-            0, /* signal_id */
-            g_quark_from_string (signal),   /* signal_detail */
+            g_signal_lookup ("changed", G_TYPE_SETTINGS), /* signal_id */
+            quark,   /* signal_detail */
             NULL, /* closure */
             G_CALLBACK (func), /* callback function */
             user_data);
-    DEBUG ("Removed %d handlers for signal '%s' from schema '%s'", matched, signal, schema);
-
-    g_free (signal);
+    LEAVE ("Schema: %s, key: %s - removed %d handlers for 'changed' signal", schema, key, matched);
 }
 
 

Modified: gnucash/trunk/src/business/business-gnome/gnc-plugin-page-invoice.c
===================================================================
--- gnucash/trunk/src/business/business-gnome/gnc-plugin-page-invoice.c	2013-10-29 20:53:21 UTC (rev 23355)
+++ gnucash/trunk/src/business/business-gnome/gnc-plugin-page-invoice.c	2013-10-30 14:43:58 UTC (rev 23356)
@@ -621,7 +621,6 @@
 
     plugin_page = GNC_PLUGIN_PAGE(user_data);
     page = GNC_PLUGIN_PAGE_INVOICE (user_data);
-    g_return_if_fail(page != NULL);
     priv = GNC_PLUGIN_PAGE_INVOICE_GET_PRIVATE(page);
 
     if (gnc_prefs_get_bool (GNC_PREFS_GROUP_GENERAL, GNC_PREF_SUMMARYBAR_POSITION_TOP))



More information about the gnucash-changes mailing list