SegFault when modifying widget hierarchy in DropTarget::enter or motion
Modifying a widget's children hierarchy in GtkDropTarget::enter/motion/leave signal handlers leads to a segmentation fault (see backtrace below).
Steps to reproduce
- Compile this MWE (e.g. with
gcc $( pkg-config --cflags gtk4 ) -g -o main main.c $( pkg-config --libs gtk4 )
) main.c - Run it. Drag the text from the entry below over the GtkBox above it, and hover in and out of the window on different edges a couple of times.
- It crashes.
Version information
GTK 4.14.4 Linux - Archlinux
Tried under both Gnome and KDE, and both X11 and Wayland. All 4 possibliities gave me the same crash and same backtrace.
Warnings
No visible warnings.
Backtrace
GtkDropTarget::enter
GtkDropTarget::leave
Thread 1 "main" received signal SIGSEGV, Segmentation fault.
gtk_synthesize_crossing_events.isra.0 (crossing_type=crossing_type@entry=GTK_CROSSING_DROP, old_target=old_target@entry=0x555556140fb0 [GtkLabel],
new_target=new_target@entry=0x55555562f930 [GtkApplicationWindow], surface_x=<optimized out>, surface_y=<optimized out>, mode=mode@entry=GDK_CROSSING_NORMAL, drop=<optimized out>,
toplevel=<optimized out>) at ../gtk/gtk/gtkmain.c:1215
1215 for (w = old_target; w != ancestor; w = _gtk_widget_get_parent (w))
(gdb) bt
#0 gtk_synthesize_crossing_events.isra.0
(crossing_type=crossing_type@entry=GTK_CROSSING_DROP, old_target=old_target@entry=0x555556140fb0 [GtkLabel], new_target=new_target@entry=0x55555562f930 [GtkApplicationWindow], surface_x=<optimized out>, surface_y=<optimized out>, mode=mode@entry=GDK_CROSSING_NORMAL, drop=<optimized out>, toplevel=<optimized out>) at ../gtk/gtk/gtkmain.c:1215
#1 0x00007ffff756c42b in handle_pointing_event (event=0x5555558d5bf0 [GdkDNDEvent]) at ../gtk/gtk/gtkmain.c:1443
#2 gtk_main_do_event (event=0x5555558d5bf0 [GdkDNDEvent]) at ../gtk/gtk/gtkmain.c:1603
#8 0x00007ffff6d49904 in <emit signal '???' on instance 0x55555566a3f0 [GdkWaylandToplevel]> (instance=instance@entry=0x55555566a3f0, signal_id=<optimized out>, detail=detail@entry=0)
at ../glib/gobject/gsignal.c:3583
#3 0x00007ffff77c3580 in _gdk_marshal_BOOLEAN__POINTERv
(closure=<optimized out>, return_value=0x7fffffffd840, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555633b00)
at gdk/gdkmarshalers.c:302
#4 0x00007ffff7853cbc in gdk_surface_event_marshallerv
(closure=0x5555558c04e0, return_value=0x7fffffffd840, instance=0x55555566a3f0, args=0x7fffffffd930, marshal_data=0x0, n_params=1, param_types=0x555555633b00) at ../gtk/gdk/gdksurface.c:462
#5 0x00007ffff6d49732 in _g_closure_invoke_va
(closure=0x5555558c04e0, return_value=0x7fffffffd840, instance=0x55555566a3f0, args=0x7fffffffd930, n_params=<optimized out>, param_types=0x555555633b00) at ../glib/gobject/gclosure.c:897
#6 signal_emit_valist_unlocked (instance=instance@entry=0x55555566a3f0, signal_id=signal_id@entry=136, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd930)
at ../glib/gobject/gsignal.c:3424
#7 0x00007ffff6d49842 in g_signal_emit_valist (instance=0x55555566a3f0, signal_id=136, detail=0, var_args=var_args@entry=0x7fffffffd930) at ../glib/gobject/gsignal.c:3263
#9 0x00007ffff78f3fc0 in gdk_surface_handle_event.isra.0 (event=event@entry=0x5555558d5bf0 [GdkDNDEvent]) at ../gtk/gdk/gdksurface.c:2932
#10 0x00007ffff78f4132 in _gdk_event_emit.isra.0 (event=event@entry=0x5555558d5bf0 [GdkDNDEvent]) at ../gtk/gdk/gdkevents.c:491
#11 0x00007ffff77dd07e in gdk_event_source_dispatch (base=<optimized out>, callback=<optimized out>, data=<optimized out>) at ../gtk/gdk/wayland/gdkeventsource.c:142
#12 0x00007ffff6dd2a89 in g_main_dispatch (context=0x5555555815e0) at ../glib/glib/gmain.c:3344
#13 0x00007ffff6e349b7 in g_main_context_dispatch_unlocked (context=0x5555555815e0) at ../glib/glib/gmain.c:4152
#14 g_main_context_iterate_unlocked.isra.0 (context=context@entry=0x5555555815e0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/glib/gmain.c:4217
#15 0x00007ffff6dd1f95 in g_main_context_iteration (context=context@entry=0x5555555815e0, may_block=may_block@entry=1) at ../glib/glib/gmain.c:4282
#16 0x00007ffff6fa1b76 in g_application_run (application=0x55555557e5d0 [GtkApplication], argc=<optimized out>, argv=0x7fffffffdd88) at ../glib/gio/gapplication.c:2712
#17 0x0000555555556a78 in main (argc=1, argv=0x7fffffffdd88) at main.c:149
Edited by Benjamin Hennion