Skip to content

Occasional crash (segmentation fault) on deleting a feed from the list #1424

@nekohayo

Description

@nekohayo

Version

1.15.7, but I've been seeing this heisenbug issue for years (decades?) on pretty much every Liferea version.

Problematic Behavior

Sometimes, if you try to delete a feed (on my desktop computer with its huge 500 MB+ liferea.db on its SATA SSD), Liferea will crash.

Due to the seemingly random and "occasional" nature of this issue, I suspect it's either a race condition, or some pointer issue, or it might be highly dependent on the position of the feed in the list (ex: at the end of a folder? Sandwiched between two other items? Sandwiched between two folders? I'm not sure).

Steps to Reproduce

It might be tricky to consistently reproduce, or maybe if you add and delete enough feeds you will encounter it.

Today I set out to trigger the crash to give you a backtrace.

While running under GDB, I deleted about 5 to 10 feeds without problem (no crashes), until I finally hit one where it would crash. Here is a screenshot so you can see its relative position in the feeds list:

Image

Crash logs

First, the basic backtrace:

(gdb) bt
#0  gtk_tree_store_iter_n_children (tree_model=0x555555a6b4b0, iter=0x7fffffffae50) at ../gtk/gtktreestore.c:768
#1  0x00007ffff0f123ce in gtk_tree_model_filter_build_level
    (filter=0x555555a8bf40 [GtkTreeModelFilter], parent_level=0x5555563740c0, parent_elt=0x55555664ddb0, emit_inserted=0) at ../gtk/gtktreemodelfilter.c:785
#2  0x00007ffff0f19380 in gtk_tree_model_filter_update_children.part.0.lto_priv.0
    (filter=0x555555a8bf40 [GtkTreeModelFilter], level=0x5555563740c0, elt=0x55555664ddb0) at ../gtk/gtktreemodelfilter.c:1828
#3  0x00007ffff0f1417d in gtk_tree_model_filter_update_children (filter=0x555555a8bf40 [GtkTreeModelFilter], level=0x5555563740c0, elt=0x55555664ddb0)
    at ../gtk/gtktreemodelfilter.c:1815
#4  gtk_tree_model_filter_row_changed (c_model=<optimized out>, c_path=0x555559988900, c_iter=<optimized out>, data=0x555555a8bf40)
    at ../gtk/gtktreemodelfilter.c:2077
#5  0x00007ffff0f14f2d in gtk_tree_model_filter_refilter_helper (model=<optimized out>, path=<optimized out>, iter=<optimized out>, data=<optimized out>)
    at ../gtk/gtktreemodelfilter.c:4244
#6  0x00007ffff0f0bedb in gtk_tree_model_foreach_helper
    (model=model@entry=0x555555a6b4b0, iter=iter@entry=0x7fffffffb0e0, path=path@entry=0x555559988900, func=func@entry=0x7ffff0f14f20 <gtk_tree_model_filter_refilter_helper>, user_data=user_data@entry=0x555555a8bf40) at ../gtk/gtktreemodel.c:1995
#7  0x00007ffff0f0d750 in gtk_tree_model_foreach (model=0x555555a6b4b0, func=0x7ffff0f14f20 <gtk_tree_model_filter_refilter_helper>, user_data=0x555555a8bf40)
    at ../gtk/gtktreemodel.c:2048
#8  0x00005555555a1279 in feed_list_view_selection_changed_cb (selection=<optimized out>, data=<optimized out>) at ui/feed_list_view.c:138
#12 0x00007ffff0bc8733 in <emit signal 'changed' on instance 0x555555651c70 [GtkTreeSelection]>
    (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3582
    #9  0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x555555a9e690, return_value=0x0, instance=0x555555651c70, args=0x7fffffffb430, n_params=0, param_types=0x0) at ../gobject/gclosure.c:896
    #10 signal_emit_valist_unlocked
    (instance=instance@entry=0x555555651c70, signal_id=signal_id@entry=259, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffb430)
    at ../gobject/gsignal.c:3423
    #11 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x555555651c70, signal_id=259, detail=0, var_args=var_args@entry=0x7fffffffb430)
    at ../gobject/gsignal.c:3262
#13 0x00007ffff0f37f66 in gtk_tree_view_real_set_cursor (tree_view=0x55555583e640 [GtkTreeView], path=0x55555bfc3df0, flags=(CLEAR_AND_SELECT | CURSOR_INVALID))
    at ../gtk/gtktreeview.c:13326
#14 0x00007ffff0f3210d in gtk_tree_view_row_deleted (model=<optimized out>, path=<optimized out>, data=0x55555583e640) at ../gtk/gtktreeview.c:9408
#15 0x00007ffff0ba77da in g_closure_invoke (closure=0x555555a8b820, return_value=0x0, n_param_values=2, param_values=0x7fffffffb810, invocation_hint=0x7fffffffb760)
    at ../gobject/gclosure.c:833
#16 0x00007ffff0bd78f3 in signal_emit_unlocked_R.isra.0
    (node=node@entry=0x7fffffffb920, detail=detail@entry=0, instance=instance@entry=0x555555a6b4b0, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffb810) at ../gobject/gsignal.c:3887
#17 0x00007ffff0bc83e9 in signal_emit_valist_unlocked
    (instance=instance@entry=0x555555a6b4b0, signal_id=signal_id@entry=288, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffba90)
    at ../gobject/gsignal.c:3519
#18 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x555555a6b4b0, signal_id=288, detail=0, var_args=var_args@entry=0x7fffffffba90) at ../gobject/gsignal.c:3262
#19 0x00007ffff0bc8733 in g_signal_emit (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3582
#20 0x00007ffff0f1faca in gtk_tree_store_remove (tree_store=0x555555a6b4b0 [GtkTreeStore], iter=iter@entry=0x55555664dd00) at ../gtk/gtktreestore.c:1231
#21 0x00005555555a6f79 in feed_list_view_remove_node (node=0x555556a17950) at ui/feed_list_view.c:761
#22 0x000055555557ee75 in feed_remove (node=0x555556a17950) at tests/../feed.c:390
#23 0x000055555557fe50 in node_remove (node=0x555556a17950) at tests/../node.c:347
#24 feedlist_node_removed (node=0x555556a17950) at tests/../feedlist.c:487
#25 0x00005555555a547d in feedlist_remove_node (node=<optimized out>) at tests/../feedlist.c:473
#26 feed_list_view_remove_cb (dialog=0x555556965980 [GtkMessageDialog], response_id=<optimized out>, user_data=<optimized out>) at ui/feed_list_view.c:881
#31 0x00007ffff0bc8733 in <emit signal 'response' on instance 0x555556965980 [GtkMessageDialog]>
    (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>) at ../gobject/gsignal.c:3582
    #27 0x00007ffff0ba5e3d in g_cclosure_marshal_VOID__INTv
    (closure=<optimized out>, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x55555998dae0) at ../gobject/gmarshal.c:596
    #28 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x555559b5f280, return_value=0x0, instance=0x555556965980, args=0x7fffffffbf00, n_params=1, param_types=0x55555998dae0) at ../gobject/gclosure.c:896
    #29 signal_emit_valist_unlocked
    (instance=instance@entry=0x555556965980, signal_id=signal_id@entry=494, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffbf00)
    at ../gobject/gsignal.c:3423
    #30 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x555556965980, signal_id=494, detail=0, var_args=var_args@entry=0x7fffffffbf00)
    at ../gobject/gsignal.c:3262
#35 0x00007ffff0bc8733 in <emit signal 'clicked' on instance 0x55555a42cc80 [GtkButton]> (instance=<optimized out>, signal_id=<optimized out>, detail=<optimized out>)
    at ../gobject/gsignal.c:3582
    #32 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x55555a6caca0, return_value=0x0, instance=0x55555a42cc80, args=0x7fffffffc230, n_params=0, param_types=0x0) at ../gobject/gclosure.c:896
    #33 signal_emit_valist_unlocked
    (instance=instance@entry=0x55555a42cc80, signal_id=signal_id@entry=276, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffc230)
    at ../gobject/gsignal.c:3423
    #34 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x55555a42cc80, signal_id=276, detail=0, var_args=var_args@entry=0x7fffffffc230)
    at ../gobject/gsignal.c:3262
#36 0x00007ffff0ccb721 in gtk_button_do_release (button=<optimized out>, emit_clicked=<optimized out>) at ../gtk/gtkbutton.c:1845
#37 gtk_button_do_release (button=0x55555a42cc80 [GtkButton], emit_clicked=1) at ../gtk/gtkbutton.c:1832
#38 gtk_real_button_released (button=0x55555a42cc80 [GtkButton]) at ../gtk/gtkbutton.c:1963
#42 0x00007ffff0bc8733 in <emit signal 'released' on instance 0x55555a42cc80 [GtkButton]>
    (instance=instance@entry=0x55555a42cc80, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3582
    #39 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x5555556dbf40, return_value=0x0, instance=0x55555a42cc80, args=0x7fffffffc5b0, n_params=0, param_types=0x0) at ../gobject/gclosure.c:896
    #40 signal_emit_valist_unlocked
    (instance=instance@entry=0x55555a42cc80, signal_id=signal_id@entry=275, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffc5b0)
    at ../gobject/gsignal.c:3423
    #41 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x55555a42cc80, signal_id=275, detail=0, var_args=var_args@entry=0x7fffffffc5b0)
    at ../gobject/gsignal.c:3262
#43 0x00007ffff0ccb55d in multipress_released_cb
    (gesture=0x555559b281a0 [GtkGestureMultiPress], n_press=<optimized out>, x=<optimized out>, y=<optimized out>, widget=0x55555a42cc80 [GtkButton])
    at ../gtk/gtkbutton.c:666
#48 0x00007ffff0bc8733 in <emit signal 'released' on instance 0x555559b281a0 [GtkGestureMultiPress]>
    (instance=instance@entry=0x555559b281a0, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3582
    #44 0x00007ffff0c8a11c 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=0x5555557adc30) at gtk/gtkmarshalers.c:4804
    #45 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x555556514c80, return_value=0x0, instance=0x555559b281a0, args=0x7fffffffc940, n_params=3, param_types=0x5555557adc30) at ../gobject/gclosure.c:896
    #46 signal_emit_valist_unlocked
    (instance=instance@entry=0x555559b281a0, signal_id=signal_id@entry=221, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffc940)
    at ../gobject/gsignal.c:3423
    #47 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x555559b281a0, signal_id=221, detail=0, var_args=var_args@entry=0x7fffffffc940)
    at ../gobject/gsignal.c:3262
#49 0x00007ffff0da6fdb in gtk_gesture_multi_press_end (gesture=0x555559b281a0 [GtkGestureMultiPress], sequence=sequence@entry=0x0)
    at ../gtk/gtkgesturemultipress.c:287
#54 0x00007ffff0bc8733 in <emit signal 'end' on instance 0x555559b281a0 [GtkGestureMultiPress]>
    (instance=instance@entry=0x555559b281a0, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3582
    #50 0x00007ffff0babe05 in g_cclosure_marshal_VOID__BOXEDv
    (closure=0x55555575c580, return_value=<optimized out>, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x5555557599f0) at ../gobject/gmarshal.c:1686
    #51 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x55555575c580, return_value=0x0, instance=0x555559b281a0, args=0x7fffffffcd30, n_params=1, param_types=0x5555557599f0) at ../gobject/gclosure.c:896
    #52 signal_emit_valist_unlocked
    (instance=instance@entry=0x555559b281a0, signal_id=signal_id@entry=216, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffcd30)
    at ../gobject/gsignal.c:3423
    #53 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x555559b281a0, signal_id=216, detail=0, var_args=var_args@entry=0x7fffffffcd30)
    at ../gobject/gsignal.c:3262
#55 0x00007ffff0d9ec24 in _gtk_gesture_set_recognized (gesture=0x555559b281a0 [GtkGestureMultiPress], recognized=0, sequence=0x0) at ../gtk/gtkgesture.c:346
#56 _gtk_gesture_check_recognized (gesture=gesture@entry=0x555559b281a0 [GtkGestureMultiPress], sequence=sequence@entry=0x0) at ../gtk/gtkgesture.c:387
#57 0x00007ffff0da69b3 in gtk_gesture_handle_event (controller=0x555559b281a0 [GtkGestureMultiPress], event=0x55555c0fa1d0) at ../gtk/gtkgesture.c:787
#58 0x00007ffff0daa21e in gtk_gesture_single_handle_event (controller=0x555559b281a0 [GtkGestureMultiPress], event=0x55555c0fa1d0) at ../gtk/gtkgesturesingle.c:222
#59 0x00007ffff0d692d3 in gtk_event_controller_handle_event (controller=0x555559b281a0 [GtkGestureMultiPress], event=0x55555c0fa1d0)
    at ../gtk/gtkeventcontroller.c:230
#60 0x00007ffff0f4ffd0 in _gtk_widget_run_controllers (widget=0x55555a42cc80 [GtkButton], event=0x55555c0fa1d0, phase=GTK_PHASE_BUBBLE) at ../gtk/gtkwidget.c:7447
#65 0x00007ffff0bc8733 in <emit signal 'button-release-event' on instance 0x55555a42cc80 [GtkButton]>
    (instance=instance@entry=0x55555a42cc80, signal_id=<optimized out>, detail=detail@entry=0) at ../gobject/gsignal.c:3582
    #61 0x00007ffff0c888d9 in _gtk_marshal_BOOLEAN__BOXEDv
    (closure=0x5555556a9ae0, return_value=0x7fffffffd140, instance=<optimized out>, args=<optimized out>, marshal_data=<optimized out>, n_params=<optimized out>, param_types=0x555555653260) at gtk/gtkmarshalers.c:130
    #62 0x00007ffff0bc855c in _g_closure_invoke_va
    (closure=0x5555556a9ae0, return_value=0x7fffffffd140, instance=0x55555a42cc80, args=0x7fffffffd230, n_params=1, param_types=0x555555653260)
    at ../gobject/gclosure.c:896
    #63 signal_emit_valist_unlocked
    (instance=instance@entry=0x55555a42cc80, signal_id=signal_id@entry=94, detail=detail@entry=0, var_args=var_args@entry=0x7fffffffd230) at ../gobject/gsignal.c:3423
    #64 0x00007ffff0bc8671 in g_signal_emit_valist (instance=0x55555a42cc80, signal_id=94, detail=0, var_args=var_args@entry=0x7fffffffd230)
    at ../gobject/gsignal.c:3262
#66 0x00007ffff0f5fe3c in gtk_widget_event_internal.part.0.lto_priv.0 (widget=0x55555a42cc80 [GtkButton], event=0x55555c0fa1d0) at ../gtk/gtkwidget.c:7812
#67 0x00007ffff0df4328 in propagate_event_up (widget=0x55555a42cc80 [GtkButton], event=<optimized out>, topmost=<optimized out>) at ../gtk/gtkmain.c:2588
#68 propagate_event (widget=<optimized out>, event=0x55555c0fa1d0, captured=<optimized out>, topmost=0x0) at ../gtk/gtkmain.c:2691
#69 0x00007ffff0df50aa in gtk_main_do_event (event=<optimized out>) at ../gtk/gtkmain.c:1921
#70 gtk_main_do_event (event=<optimized out>) at ../gtk/gtkmain.c:1691
#71 0x00007ffff7ed6807 in _gdk_event_emit (event=0x55555c0fa1d0) at ../gdk/gdkevents.c:73
#72 _gdk_event_emit (event=0x55555c0fa1d0) at ../gdk/gdkevents.c:67
#73 0x00007ffff7f102ae in gdk_event_source_dispatch (base=<optimized out>, callback=<optimized out>, data=<optimized out>) at ../gdk/wayland/gdkeventsource.c:124
#74 0x00007ffff0a9128c in g_main_dispatch (context=0x5555556335c0) at ../glib/gmain.c:3357
#75 g_main_context_dispatch_unlocked (context=0x5555556335c0) at ../glib/gmain.c:4208
#76 0x00007ffff0af17b8 in g_main_context_iterate_unlocked.isra.0
    (context=context@entry=0x5555556335c0, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib/gmain.c:4273
#77 0x00007ffff0a92783 in g_main_context_iteration (context=context@entry=0x5555556335c0, may_block=may_block@entry=1) at ../glib/gmain.c:4338
#78 0x00007ffff14e0dcd in g_application_run (application=0x555555631410 [LifereaApplication], argc=argc@entry=1, argv=argv@entry=0x7fffffffd7d8)
    at ../gio/gapplication.c:2715
#79 0x000055555558350f in liferea_application_new (argc=1, argv=0x7fffffffd7d8) at tests/../liferea_application.c:343
#80 0x00007ffff077b248 in __libc_start_call_main (main=main@entry=0x555555574df0 <main>, argc=argc@entry=1, argv=argv@entry=0x7fffffffd7d8)
    at ../sysdeps/nptl/libc_start_call_main.h:58
#81 0x00007ffff077b30b in __libc_start_main_impl
    (main=0x555555574df0 <main>, argc=1, argv=0x7fffffffd7d8, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffd7c8)
    at ../csu/libc-start.c:360
#82 0x0000555555574ea5 in _start ()

And if you need more, here's the output of:

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions