GtkStackSidebar: segfault when removing a GtkStack page
Steps to reproduce
- Create a GtkStack and bind a GtkStackSidebar to it
- Add some widgets to the GtkStack
- Remove one of the added widget with
gtk_stack_remove()
Current behavior
Segfault! (see backtrace below)
Expected outcome
No segfault
Version information
gtk-4.10.4 (opensuse Tumbleweed)
Additional information
Removing a GtkStack widget will call clear_sidebar()
in gtkstacksidebar.c
, which calls g_signal_handlers_disconnect_by_func (page, ...)
but the page
seems to already have been disposed at this point of time, thus the segfault.
Interestingly, if I add a reference to the widget's GtkStackPage before calling gtk_stack_remove()
then the segfault doesn't occur.
Sorry, can't post the reproducer (private app), but please find here a backtrace:
(gdb) bt -full
#0 0x00007ffff70e4b19 in g_type_check_instance () at /lib64/libgobject-2.0.so.0
#1 0x00007ffff70d8e14 in g_signal_handlers_disconnect_matched () at /lib64/libgobject-2.0.so.0
#2 0x00007ffff5a0ebab in clear_sidebar (self=self@entry=0x555555e5e860) at ../gtk/gtkstacksidebar.c:263
iter = {dummy1 = 0x555555e749b0, dummy2 = 0x555555e676f0, dummy3 = 0x7fffffffc4f0, dummy4 = 5, dummy5 = 32767, dummy6 = 0x7fff00000006}
page = 0x555555f8d3f0
row = 0x555555f8e700
#3 0x00007ffff5a0ebfc in items_changed_cb (model=<optimized out>, position=<optimized out>, removed=<optimized out>, added=<optimized out>, self=0x555555e5e860) at ../gtk/gtkstacksidebar.c:275
#4 0x00007ffff70c0448 in g_closure_invoke () at /lib64/libgobject-2.0.so.0
#5 0x00007ffff70d34fe in () at /lib64/libgobject-2.0.so.0
#6 0x00007ffff70da82e in g_signal_emit_valist () at /lib64/libgobject-2.0.so.0
#7 0x00007ffff70da9df in g_signal_emit () at /lib64/libgobject-2.0.so.0
#8 0x00007ffff6eaf77f in g_list_model_items_changed (list=<optimized out>, position=<optimized out>, removed=<optimized out>, added=<optimized out>) at ../gio/glistmodel.c:321
__func__ = "g_list_model_items_changed"
#9 0x00007ffff5a0d6cd in gtk_stack_remove (stack=0x555555e5e2d0, child=0x5555574e2fd0) at ../gtk/gtkstack.c:1805
priv = <optimized out>
position = <optimized out>
__func__ = "gtk_stack_remove"