Skip to content

gs-application: Split local options handler

Milan Crha requested to merge wip/split-local-options-handler into main

Some options can be processed only after the plugin loader and the shell are fully loaded/setup, otherwise they can cause a crash. This splits the action-options into a separate function and postpones the invocation of those after the startup initialization is finished.


As a reproducer, run:

    gnome-software --autoupdate

which crashes with

this backtrace
Thread 1 "gnome-software" received signal SIGSEGV, Segmentation fault.
0x0000000000480291 in gs_shell_get_mode (shell=0x0) at ../src/gs-shell.c:2286
2286		if (g_strcmp0 (adw_view_stack_get_visible_child_name (shell->stack_loading), "loading") == 0)

#0  0x0000000000480291 in gs_shell_get_mode (shell=0x0) at ../src/gs-shell.c:2286
#1  0x000000000048da7e in gs_updates_page_switch_to (page=0x970510 [GsUpdatesPage]) at ../src/gs-updates-page.c:684
#2  0x000000000046ae5f in gs_page_switch_to (page=0x970510 [GsUpdatesPage]) at ../src/gs-page.c:681
#3  0x000000000047ba59 in stack_notify_visible_child_cb (object=0x960dd0 [AdwViewStack], pspec=0x916f70 [GParamObject], user_data=0x7fada0) at ../src/gs-shell.c:500
#8  0x00007ffff7bcc846 in <emit signal notify:visible-child on instance 0x960dd0 [AdwViewStack]> (instance=0x960dd0, signal_id=1, detail=1504) at ../gobject/gsignal.c:3606
    #4  0x00007ffff7bb0d3d in g_cclosure_marshal_VOID__PARAM (closure=0xdba9d0, return_value=0x0, n_param_values=2, param_values=0x7fffffffc590, invocation_hint=0x7fffffffc4d0, marshal_data=0x0) at ../gobject/gmarshal.c:1516
    #5  0x00007ffff7babe92 in g_closure_invoke (closure=0xdba9d0, return_value=0x0, n_param_values=2, param_values=0x7fffffffc590, invocation_hint=0x7fffffffc4d0) at ../gobject/gclosure.c:832
    #6  0x00007ffff7bcd016 in signal_emit_unlocked_R (node=0x546750, detail=1504, instance=0x960dd0, emission_return=0x0, instance_and_params=0x7fffffffc590) at ../gobject/gsignal.c:3796
    #7  0x00007ffff7bcc2f7 in g_signal_emit_valist (instance=0x960dd0, signal_id=1, detail=1504, var_args=0x7fffffffc858) at ../gobject/gsignal.c:3549
#9  0x00007ffff7bb4351 in g_object_dispatch_properties_changed (object=0x960dd0 [AdwViewStack], n_pspecs=1, pspecs=0x7fffffffc980) at ../gobject/gobject.c:1577
#10 0x00007ffff7bb460d in g_object_notify_by_spec_internal (object=0x960dd0 [AdwViewStack], pspec=0x916f70 [GParamObject]) at ../gobject/gobject.c:1693
#11 0x00007ffff7bb47be in g_object_notify_by_pspec (object=0x960dd0 [AdwViewStack], pspec=0x916f70 [GParamObject]) at ../gobject/gobject.c:1799
#12 0x00007ffff6e43dd9 in set_visible_child () at /lib64/libadwaita-1.so.0
#13 0x000000000047bd8f in gs_shell_change_mode (shell=0x7fada0 [GsShell], mode=GS_SHELL_MODE_UPDATES, data=0x0, scroll_up=1) at ../src/gs-shell.c:607
#14 0x000000000048027e in gs_shell_set_mode (shell=0x7fada0 [GsShell], mode=GS_SHELL_MODE_UPDATES) at ../src/gs-shell.c:2278
#15 0x000000000043705e in autoupdate_activated (action=0x812c50 [GSimpleAction], parameter=0x0, data=0x553110) at ../src/gs-application.c:866
#20 0x00007ffff7bcc846 in <emit signal ??? on instance 0x812c50 [GSimpleAction]> (instance=0x812c50, signal_id=77, detail=0) at ../gobject/gsignal.c:3606
    #16 0x00007ffff7bb1519 in g_cclosure_marshal_VOID__VARIANT (closure=0x820f40, return_value=0x0, n_param_values=2, param_values=0x7fffffffcd30, invocation_hint=0x7fffffffcc70, marshal_data=0x0) at ../gobject/gmarshal.c:1964
    #17 0x00007ffff7babe92 in g_closure_invoke (closure=0x820f40, return_value=0x0, n_param_values=2, param_values=0x7fffffffcd30, invocation_hint=0x7fffffffcc70) at ../gobject/gclosure.c:832
    #18 0x00007ffff7bcd016 in signal_emit_unlocked_R (node=0x8773b0, detail=0, instance=0x812c50, emission_return=0x0, instance_and_params=0x7fffffffcd30) at ../gobject/gsignal.c:3796
    #19 0x00007ffff7bcc2f7 in g_signal_emit_valist (instance=0x812c50, signal_id=77, detail=0, var_args=0x7fffffffcff8) at ../gobject/gsignal.c:3549
#21 0x00007ffff7d2b8db in g_simple_action_activate (action=0x812c50, parameter=0x0) at ../gio/gsimpleaction.c:227
#22 0x00007ffff7d29cfe in g_action_activate (action=0x812c50, parameter=0x0) at ../gio/gaction.c:399
#23 0x00007ffff7d263f2 in g_simple_action_group_activate (group=0x54a590, action_name=0x4a0583 "autoupdate", parameter=0x0) at ../gio/gsimpleactiongroup.c:140
#24 0x00007ffff7d255f3 in g_action_group_activate_action (action_group=0x54a590, action_name=0x4a0583 "autoupdate", parameter=0x0) at ../gio/gactiongroup.c:631
#25 0x00007ffff7d20778 in g_application_activate_action (action_group=0x553110, action_name=0x4a0583 "autoupdate", parameter=0x0) at ../gio/gapplication.c:2697
#26 0x00007ffff7d255f3 in g_action_group_activate_action (action_group=0x553110, action_name=0x4a0583 "autoupdate", parameter=0x0) at ../gio/gactiongroup.c:631
#27 0x0000000000437f88 in gs_application_handle_local_options (app=0x553110 [GsApplication], options=0x577760) at ../src/gs-application.c:1235
#28 0x00007ffff7c9fe88 in _g_cclosure_marshal_INT__BOXEDv
    (closure=0x54f9b0, return_value=0x7fffffffd5b0, instance=0x553110, args=0x7fffffffd748, marshal_data=0x437e4a <gs_application_handle_local_options>, n_params=1, param_types=0x54f9e0) at ../gio/gmarshal-internal.c:760
#29 0x00007ffff7bac633 in g_type_class_meta_marshalv (closure=0x54f9b0, return_value=0x7fffffffd5b0, instance=0x553110, args=0x7fffffffd748, marshal_data=0xf0, n_params=1, param_types=0x54f9e0) at ../gobject/gclosure.c:1060
#30 0x00007ffff7bac186 in _g_closure_invoke_va (closure=0x54f9b0, return_value=0x7fffffffd5b0, instance=0x553110, args=0x7fffffffd748, n_params=1, param_types=0x54f9e0) at ../gobject/gclosure.c:895
#31 0x00007ffff7bcb642 in g_signal_emit_valist (instance=0x553110, signal_id=11, detail=0, var_args=0x7fffffffd748) at ../gobject/gsignal.c:3456
#32 0x00007ffff7bcc846 in g_signal_emit (instance=0x553110, signal_id=11, detail=0) at ../gobject/gsignal.c:3606
#33 0x00007ffff7d1d813 in g_application_real_local_command_line (application=0x553110 [GsApplication], arguments=0x7fffffffd8c8, exit_status=0x7fffffffd8c4) at ../gio/gapplication.c:1105
#34 0x00007ffff7d200a0 in g_application_run (application=0x553110 [GsApplication], argc=2, argv=0x7fffffffda88) at ../gio/gapplication.c:2540
#35 0x0000000000461a91 in main (argc=2, argv=0x7fffffffda88) at ../src/gs-main.c:49

Note of the shell being NULL, because the Updates page was not setup yet.

Merge request reports