From e805e8ba39e38c404efac002972e40f155a878a6 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Sun, 27 Apr 2025 00:31:51 +0200 Subject: [PATCH] gsignalgroup: make GSignalGroup.dispose() a bit more reentrant dispose() would previously set the "handlers" pointer to NULL. But dispose() also calls g_signal_group_gc_handlers(), which requires this pointer to be not NULL. This means, dispose() could not be called multiple times. Which is a good practice to allow, because g_object_run_dispose() and object resurrection both requires that dispose() can be called more than once per object. Fix that problem, by leaving the array until finalize(). Fixes: dd43471f6064 ('gobject: add GSignalGroup') --- gobject/gsignalgroup.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gobject/gsignalgroup.c b/gobject/gsignalgroup.c index 19f4427c4..75511a020 100644 --- a/gobject/gsignalgroup.c +++ b/gobject/gsignalgroup.c @@ -527,7 +527,7 @@ g_signal_group_dispose (GObject *object) if (self->has_bound_at_least_once) g_signal_group_unbind (self); - g_clear_pointer (&self->handlers, g_ptr_array_unref); + g_ptr_array_set_size (self->handlers, 0); g_rec_mutex_unlock (&self->mutex); @@ -541,6 +541,7 @@ g_signal_group_finalize (GObject *object) g_weak_ref_clear (&self->target_ref); g_rec_mutex_clear (&self->mutex); + g_ptr_array_unref (self->handlers); G_OBJECT_CLASS (g_signal_group_parent_class)->finalize (object); }