uridecodebin segfault (race condition).
I am debugging an application that uses GStreamer for decoding video (1.16.2). Intermittently, there is a segmentation fault that happens when a pipeline is being set to NULL. The backtrace seems to point to decodebin when it is cleaning up the spawned pads (there should only be one exposed though).
--Type <RET> for more, q to quit, c to continue without paging--
Thread 1 "televic-hmi-gui" received signal SIGSEGV, Segmentation fault.
0x00007ffff7c4630d in g_type_check_instance_is_fundamentally_a () from /lib/x86_64-linux-gnu/libgobject-2.0.so.0
(gdb) bt
#0 0x00007ffff7c4630d in g_type_check_instance_is_fundamentally_a () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#1 0x00007ffff7c23cce in g_object_ref () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#2 0x00007ffff7c9b5e7 in gst_object_ref () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#3 0x00007ffff7ce6e1f in gst_pad_get_peer () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#4 0x00007ffff7cc6995 in gst_element_remove_pad () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#5 0x00007ffff6009ccd in () at /lib/x86_64-linux-gnu/libffi.so.7
#6 0x00007ffff600925a in () at /lib/x86_64-linux-gnu/libffi.so.7
#7 0x00007ffff7c1f7fc in g_cclosure_marshal_generic () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#8 0x00007ffff7c1efd2 in g_closure_invoke () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#9 0x00007ffff7c32784 in () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#10 0x00007ffff7c3d54f in g_signal_emit_valist () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#11 0x00007ffff7c3dedf in g_signal_emit () at /lib/x86_64-linux-gnu/libgobject-2.0.so.0
#12 0x00007ffff7cc6a38 in gst_element_remove_pad () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#13 0x00007fffe81b400c in gst_decode_chain_free_internal (chain=0x7fff000269f0, hide=1) at gstdecodebin2.c:3445
#14 0x00007fffe81b413a in gst_decode_group_free_internal (group=0x7fff30002940, hide=1) at gstdecodebin2.c:3599
#15 0x00007fffe81b3a44 in gst_decode_chain_free_internal (chain=0x7fff700928c0, hide=1) at gstdecodebin2.c:3358
#16 0x00007fffe81b4e64 in gst_decode_bin_change_state (element=0x55555684c5f0 [GstElement|decodebin69], transition=<optimized out>) at gstdecodebin2.c:5458
#17 0x00007ffff7cc99be in gst_element_change_state () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#18 0x00007ffff7cca0de in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#19 0x00007ffff7ca6c37 in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#20 0x00007fffe81ca40a in gst_uri_decode_bin_change_state (element=0x7fff58067d30 [GstElement|uridecodebin41], transition=GST_STATE_CHANGE_PAUSED_TO_READY) at gsturidecodebin.c:2814
#21 0x00007ffff7cc99be in gst_element_change_state () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#22 0x00007ffff7cc9ba5 in gst_element_change_state () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#23 0x00007ffff7cca0de in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#24 0x00007ffff7ca6c37 in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#25 0x00007ffff7cc99be in gst_element_change_state () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#26 0x00007ffff7cca0de in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#27 0x00007ffff7ca6c37 in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#28 0x00007ffff7cc99be in gst_element_change_state () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#29 0x00007ffff7cca0de in () at /lib/x86_64-linux-gnu/libgstreamer-1.0.so.0
#30 0x0000555555604bcc in GStreamerWidget::kickPipeline() (this=this@entry=0x555555fc0700) at Widgets/gstreamerwidget.cpp:960
#31 0x0000555555604d38 in GStreamerWidget::monitorPipeline() (this=0x555555fc0700) at Widgets/gstreamerwidget.cpp:600
#32 0x00005555556757e6 in GStreamerWidget::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=<optimized out>, _c=<optimized out>, _id=<optimized out>, _a=<optimized out>)
at moc_gstreamerwidget.cpp:99
#33 0x00007ffff6935730 in () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#34 0x00007ffff693931a in QTimer::timeout(QTimer::QPrivateSignal) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#35 0x00007ffff692d635 in QObject::event(QEvent*) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#36 0x00007ffff75b2ccf in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt5Widgets.so.5
#37 0x00007ffff75bbe10 in QApplication::notify(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt5Widgets.so.5
#38 0x0000555555677738 in QMyApplication::notify(QObject*, QEvent*) (this=<optimized out>, receiver=0x555555fc49b0, event=0x7fffffffd5e0) at QMyApplication.h:18
#39 0x00007ffff6900d02 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#40 0x00007ffff6956cc0 in QTimerInfoList::activateTimers() () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#41 0x00007ffff695757c in () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#42 0x00007ffff7b355fd in g_main_context_dispatch () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#43 0x00007ffff7b35880 in () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#44 0x00007ffff7b3590f in g_main_context_iteration () at /lib/x86_64-linux-gnu/libglib-2.0.so.0
#45 0x00007ffff695790b in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#46 0x00007ffff68ff89b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#47 0x00007ffff6907672 in QCoreApplication::exec() () at /lib/x86_64-linux-gnu/libQt5Core.so.5
#48 0x000055555559a205 in main(int, char**) (argc=<optimized out>, argv=<optimized out>) at main.cpp:264