gtk3: click `At: ` checkbox in Job tab of GtkPrintUnixDialog leads into a segmentation fault
Steps to reproduce
- set
gtk-print-backends=file
in~/.config/gtk-3.0/settings.ini
to load file backend only. - open glade and create a
GtkPrintUnixDialog
. - switch to Job tab and click the
At:
checkbox.
Current behavior
Program crashed with a segmentation fault.
Expected outcome
I am not sure what is expected when you have only file backend and no printer is chosen, but the At:
checkbox is disabled if you have other backend, so I think it should be disabled.
Version information
Arch Linux, openSUSE tumbleweed and SLE15, Gtk version 3.24.22.
Additional information
Glade is used to create a GtkPrintUnixDialog
, and full back trace is here:
Thread 1 "glade" received signal SIGSEGV, Segmentation fault.
gtk_printer_option_set_lookup (set=0x0, name=name@entry=0x7ffff7b972ef "gtk-print-time") at gtkprinteroptionset.c:132
132 ptr = g_hash_table_lookup (set->hash, name);
(gdb) bt
#0 gtk_printer_option_set_lookup (set=0x0, name=name@entry=0x7ffff7b972ef "gtk-print-time") at gtkprinteroptionset.c:132
#1 0x00007ffff7ae6a0d in update_print_at_option (dialog=<optimized out>) at gtkprintunixdialog.c:1459
#5 0x00007ffff7280e9f in <emit signal ??? on instance 0x5555569f3b20 [GtkRadioButton]>
(instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3554
#2 0x00007ffff7267fc2 in g_closure_invoke
(closure=0x55555667d0d0, return_value=return_value@entry=0x0, n_param_values=1, param_values=param_values@entry=0x7fffffffc550, invocation_hint=invocation_hint@entry=0x7fffffffc4d0) at ../gobject/gclosure.c:810
#3 0x00007ffff727a693 in signal_emit_unlocked_R
(node=node@entry=0x5555556d6270, detail=detail@entry=0, instance=instance@entry=0x5555569f3b20, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffc550) at ../gobject/gsignal.c:3742
#4 0x00007ffff7280d39 in g_signal_emit_valist
(instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>, var_args=var_args@entry=0x7fffffffc6d0)
at ../gobject/gsignal.c:3498
#6 0x00007ffff79c1615 in gtk_radio_button_clicked (button=0x5555569f3b20 [GtkRadioButton]) at gtkradiobutton.c:789
#7 0x00007ffff7268131 in _g_closure_invoke_va
(closure=closure@entry=0x55555571f2d0, return_value=return_value@entry=0x0, instance=instance@entry=0x5555569f3b20, args=args@entry=0x7fffffffc9c0, n_params=0, param_types=0x0) at ../gobject/gclosure.c:873
#8 0x00007ffff7280929 in g_signal_emit_valist
(instance=0x5555569f3b20, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffc9c0)
at ../gobject/gsignal.c:3407
#9 0x00007ffff7280e9f in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>)
at ../gobject/gsignal.c:3554
#10 0x00007ffff79c169d in gtk_radio_button_clicked (button=0x5555569f3d20 [GtkRadioButton]) at gtkradiobutton.c:781
#11 0x00007ffff726820e in _g_closure_invoke_va
(closure=closure@entry=0x55555571f2d0, return_value=return_value@entry=0x0, instance=instance@entry=0x5555569f3d20, args=args@entry=0x7fffffffccb0, n_params=0, param_types=0x0) at ../gobject/gclosure.c:873
#12 0x00007ffff7280929 in g_signal_emit_valist
(instance=0x5555569f3d20, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffccb0)
at ../gobject/gsignal.c:3407
#13 0x00007ffff7280e9f in g_signal_emit
(instance=instance@entry=0x5555569f3d20, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
#14 0x00007ffff7850b2e in gtk_button_clicked (button=button@entry=0x5555569f3d20 [GtkRadioButton]) at gtkbutton.c:1541
#15 0x00007ffff7852cc0 in gtk_button_do_release (emit_clicked=1, button=0x5555569f3d20 [GtkRadioButton]) at gtkbutton.c:1845
#16 gtk_button_do_release (emit_clicked=1, button=0x5555569f3d20 [GtkRadioButton]) at gtkbutton.c:1832
#17 gtk_real_button_released (button=0x5555569f3d20 [GtkRadioButton]) at gtkbutton.c:1963
#18 0x00007ffff726820e in _g_closure_invoke_va (closure=closure@entry=0x5555556ba400, return_value=return_value@entry=0x0, instance=instance@entry=0x5555569f3d20, args=args@entry=0x7fffffffcfd0, n_params=0, param_types=0x0) at ../gobject/gclosure.c:873
#19 0x00007ffff7280929 in g_signal_emit_valist (instance=0x5555569f3d20, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffcfd0) at ../gobject/gsignal.c:3407
#20 0x00007ffff7280e9f in g_signal_emit (instance=instance@entry=0x5555569f3d20, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
#21 0x00007ffff7852850 in multipress_released_cb (gesture=0x55555674b530 [GtkGestureMultiPress], n_press=<optimized out>, x=<optimized out>, y=<optimized out>, widget=0x5555569f3d20 [GtkRadioButton]) at gtkbutton.c:666
#22 0x00007ffff7afd57b in _gtk_marshal_VOID__INT_DOUBLE_DOUBLEv (closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555556fefe0) at gtkmarshalers.c:4803
#23 0x00007ffff726820e in _g_closure_invoke_va (closure=closure@entry=0x5555566765e0, return_value=return_value@entry=0x0, instance=instance@entry=0x55555674b530, args=args@entry=0x7fffffffd2f0, n_params=3, param_types=0x5555556fefe0) at ../gobject/gclosure.c:873
#24 0x00007ffff7280929 in g_signal_emit_valist (instance=0x55555674b530, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffd2f0) at ../gobject/gsignal.c:3407
#25 0x00007ffff7280e9f in g_signal_emit (instance=instance@entry=0x55555674b530, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
#26 0x00007ffff791a504 in gtk_gesture_multi_press_end (gesture=gesture@entry=0x55555674b530 [GtkGestureMultiPress], sequence=sequence@entry=0x0) at gtkgesturemultipress.c:287
#27 0x00007ffff726b2a0 in g_cclosure_marshal_VOID__BOXEDv (closure=0x5555556be090, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555556d0ba0) at ../gobject/gmarshal.c:1686
#28 0x00007ffff726820e in _g_closure_invoke_va (closure=closure@entry=0x5555556be090, return_value=return_value@entry=0x0, instance=instance@entry=0x55555674b530, args=args@entry=0x7fffffffd670, n_params=1, param_types=0x5555556d0ba0) at ../gobject/gclosure.c:873
#29 0x00007ffff7280929 in g_signal_emit_valist (instance=0x55555674b530, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffd670) at ../gobject/gsignal.c:3407
#30 0x00007ffff7280e9f in g_signal_emit (instance=instance@entry=0x55555674b530, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
#31 0x00007ffff79118f7 in _gtk_gesture_set_recognized (sequence=0x0, recognized=0, gesture=0x55555674b530 [GtkGestureMultiPress]) at gtkgesture.c:346
#32 _gtk_gesture_check_recognized (gesture=gesture@entry=0x55555674b530 [GtkGestureMultiPress], sequence=sequence@entry=0x0) at gtkgesture.c:387
#33 0x00007ffff7919ebb in gtk_gesture_handle_event (event=0x555557469d00, controller=0x55555674b530 [GtkGestureMultiPress]) at gtkgesture.c:815
#34 gtk_gesture_handle_event (controller=0x55555674b530 [GtkGestureMultiPress], event=0x555557469d00) at gtkgesture.c:713
#35 0x00007ffff791e3df in gtk_gesture_single_handle_event (controller=0x55555674b530 [GtkGestureMultiPress], event=0x555557469d00) at gtkgesturesingle.c:222
#36 0x00007ffff78e222c in gtk_event_controller_handle_event (controller=0x55555674b530 [GtkGestureMultiPress], event=0x555557469d00) at gtkeventcontroller.c:230
#37 0x00007ffff7ab325d in _gtk_widget_run_controllers (widget=0x5555569f3d20 [GtkRadioButton], event=0x555557469d00, phase=GTK_PHASE_BUBBLE) at gtkwidget.c:7443
#38 0x00007ffff7afbcc8 in _gtk_marshal_BOOLEAN__BOXEDv (closure=0x55555561f6a0, return_value=0x7fffffffd9f0, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x55555560cd20) at gtkmarshalers.c:129
#39 0x00007ffff726820e in _g_closure_invoke_va (closure=closure@entry=0x55555561f6a0, return_value=return_value@entry=0x7fffffffd9f0, instance=instance@entry=0x5555569f3d20, args=args@entry=0x7fffffffdac0, n_params=1, param_types=0x55555560cd20) at ../gobject/gclosure.c:873
#40 0x00007ffff728009b in g_signal_emit_valist (instance=0x5555569f3d20, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffdac0) at ../gobject/gsignal.c:3407
#41 0x00007ffff7280e9f in g_signal_emit (instance=instance@entry=0x5555569f3d20, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3554
#42 0x00007ffff7ac16e4 in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x5555569f3d20 [GtkRadioButton], event=0x555557469d00) at gtkwidget.c:7808
#43 0x00007ffff7965c80 in propagate_event_up (topmost=<optimized out>, event=<optimized out>, widget=0x5555569f3d20 [GtkRadioButton]) at gtkmain.c:2587
#44 propagate_event (widget=widget@entry=0x5555569f3d20 [GtkRadioButton], event=event@entry=0x555557469d00, captured=captured@entry=0, topmost=topmost@entry=0x0) at gtkmain.c:2690
#45 0x00007ffff7965daf in gtk_propagate_event (widget=widget@entry=0x5555569f3d20 [GtkRadioButton], event=event@entry=0x555557469d00) at gtkmain.c:2724
#46 0x00007ffff7966f3b in gtk_main_do_event (event=0x555557469d00) at gtkmain.c:1920
#47 gtk_main_do_event (event=<optimized out>) at gtkmain.c:1690
#48 0x00007ffff7eebea8 in glade_app_event_handler (event=0x555557469d00, data=0x0) at glade-app.c:414
#49 0x00007ffff7649fc3 in _gdk_event_emit (event=0x555557469d00) at gdkevents.c:73
#50 _gdk_event_emit (event=0x555557469d00) at gdkevents.c:67
#51 0x00007ffff76afd32 in gdk_event_source_dispatch (base=base@entry=0x5555555de8b0, callback=<optimized out>, data=<optimized out>) at gdkeventsource.c:124
#52 0x00007ffff71772b7 in g_main_dispatch (context=0x555555598b60) at ../glib/gmain.c:3309
#53 g_main_context_dispatch (context=0x555555598b60) at ../glib/gmain.c:3974
#54 0x00007ffff7177638 in g_main_context_iterate (context=context@entry=0x555555598b60, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4047
#55 0x00007ffff71776ef in g_main_context_iteration (context=context@entry=0x555555598b60, may_block=may_block@entry=1) at ../glib/gmain.c:4108
#56 0x00007ffff7392845 in g_application_run (application=0x5555555970f0 [GtkApplication], argc=-8620, argv=<optimized out>) at ../gio/gapplication.c:2559
#57 0x000055555556d9be in main (argc=1, argv=0x7fffffffdfc8) at main.c:174
I can also reproduce it with a small C program like this:
#include <gtk/gtk.h>
#include <gtk/gtkunixprint.h>
static void on_activate(GtkApplication *app, gpointer user_data)
{
GtkWidget *window;
GtkWidget *print_dialog;
window = gtk_application_window_new(app);
gtk_window_set_title(GTK_WINDOW(window), "test");
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
print_dialog = gtk_print_unix_dialog_new("test", GTK_WINDOW(window));
gtk_widget_show_all(window);
gtk_widget_show_all(print_dialog);
}
int main(int argc, char *argv[])
{
GtkApplication *app;
int status;
app = gtk_application_new("one.alynx.test-print-unix-dialog", G_APPLICATION_FLAGS_NONE);
g_signal_connect(app, "activate", G_CALLBACK(on_activate), NULL);
status = g_application_run(G_APPLICATION(app), argc, argv);
g_object_unref(app);
return status;
}
So I think it is a GTK issue instead of glade issue. I didn't get back trace for this C program but I think it will look like the glade one.