psppire-window: Disconnect signal handlers before unregistering. 20130506011838/pspp
authorBen Pfaff <blp@cs.stanford.edu>
Mon, 6 May 2013 04:48:06 +0000 (21:48 -0700)
committerBen Pfaff <blp@cs.stanford.edu>
Mon, 6 May 2013 04:48:06 +0000 (21:48 -0700)
Otherwise, the call to psppire_window_register_remove() calls back into
remove_menuitem() via the "remove" signal, but window->menu referenced in
that callback has already been freed.

Found by valgrind.

src/ui/gui/psppire-window.c

index c1784ac1f14d7df9a2e1880b27b971de8dc8e624..23c512d792dbb6a58769549f5408719093adc8a0 100644 (file)
@@ -236,6 +236,8 @@ psppire_window_finalize (GObject *object)
 
   PsppireWindowRegister *reg = psppire_window_register_new ();
 
+  g_signal_handler_disconnect (reg, window->remove_handler);
+  g_signal_handler_disconnect (reg, window->insert_handler);
   psppire_window_register_remove (reg, window->list_name);
   g_free (window->filename);
   g_free (window->basename);
@@ -243,12 +245,6 @@ psppire_window_finalize (GObject *object)
   g_free (window->description);
   g_free (window->list_name);
 
-  g_signal_handler_disconnect (psppire_window_register_new (),
-                              window->remove_handler);
-
-  g_signal_handler_disconnect (psppire_window_register_new (),
-                              window->insert_handler);
-
   g_hash_table_destroy (window->menuitem_table);
 
   if (G_OBJECT_CLASS (parent_class)->finalize)