Skip to content

lspclient: avoid use of stale pointer when building code action menu

Mark Nauwelaerts requested to merge work/lsp_codeaction into master

This should address segfault with following reported backtrace:

Application: Kate (kate), signal: Segmentation fault
Content of s_kcrashErrorMessage: [Current thread is 1 (Thread 0x7f98b31f08c0 (LWP 804790))]
[KCrash Handler]
#6  0x00007f98b8624eab in QListData::size (this=0x100) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/tools/qlist.h:115
#7  QtPrivate::indexOf<QWidget*, QWidget*> (from=0, u=@0x7ffeab1e85e0: 0x560891482c90, list=...) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/tools/qlist.h:1038
#8  QList<QWidget*>::indexOf (from=0, t=@0x7ffeab1e85e0: 0x560891482c90, this=0x100) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/tools/qlist.h:1026
#9  QList<QWidget*>::removeAll (this=0x100, _t=@0x7ffeab1e85e0: 0x560891482c90) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/tools/qlist.h:936
#10 0x00007f98b8637126 in QWidget::removeAction (this=0x560891482c90, action=<optimized out>) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/src/widgets/kernel/qwidget.cpp:3166
#11 0x00007f98b0680757 in std::function<void (QList<LSPCodeAction> const&)>::operator()(QList<LSPCodeAction> const&) const (__args#0=..., this=0x5608920dc9a0) at /usr/lib/gcc/x86_64-pc-linux-gnu/10.3.0/include/g++-v10/bits/std_function.h:622
#12 operator() (m=..., this=0x5608920dc990) at /usr/src/debug/kde-apps/kate-9999/kate-9999/addons/lspclient/lspclientserver.cpp:1578
#13 std::__invoke_impl<void, make_handler<QList<LSPCodeAction> >::<lambda(const GenericReplyType&)>&, const QJsonValue&> (__f=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/10.3.0/include/g++-v10/bits/invoke.h:60
#14 std::__invoke_r<void, make_handler<QList<LSPCodeAction> >::<lambda(const GenericReplyType&)>&, const QJsonValue&> (__fn=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/10.3.0/include/g++-v10/bits/invoke.h:110
#15 std::_Function_handler<void(const QJsonValue&), make_handler<QList<LSPCodeAction> >::<lambda(const GenericReplyType&)> >::_M_invoke(const std::_Any_data &, const QJsonValue &) (__functor=..., __args#0=...) at /usr/lib/gcc/x86_64-pc-linux-gnu/10.3.0/include/g++-v10/bits/std_function.h:291
#16 0x00007f98b06979f2 in std::function<void (QJsonValue const&)>::operator()(QJsonValue const&) const (__args#0=..., this=0x7ffeab1e8710) at /usr/lib/gcc/x86_64-pc-linux-gnu/10.3.0/include/g++-v10/bits/std_function.h:622
#17 LSPClientServer::LSPClientServerPrivate::read (this=0x560891cb7f40) at /usr/src/debug/kde-apps/kate-9999/kate-9999/addons/lspclient/lspclientserver.cpp:1155
#18 0x00007f98b7a5e564 in QtPrivate::QSlotObjectBase::call (a=0x7ffeab1e8820, r=0x560891cb7f88, this=0x5608920e7ff0) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:398
#19 doActivate<false> (sender=0x560891cb7f88, signal_index=3, argv=0x7ffeab1e8820, argv@entry=0x0) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qobject.cpp:3886
#20 0x00007f98b7a5798c in QMetaObject::activate (sender=sender@entry=0x560891cb7f88, m=m@entry=0x7f98b7d29940 <QIODevice::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x0) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qobject.cpp:3946
#21 0x00007f98b796a8b0 in QIODevice::readyRead (this=this@entry=0x560891cb7f88) at .moc/moc_qiodevice.cpp:191
#22 0x00007f98b79aa2c9 in QProcessPrivate::tryReadFromChannel (this=0x560890de1b60, channel=0x560890de1c70) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/io/qprocess.cpp:1068
#23 0x00007f98b79aa7f0 in QProcessPrivate::_q_canReadStandardOutput (this=<optimized out>) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/io/qprocess.cpp:1084
#24 QProcess::qt_static_metacall (_o=0x560891cb7f88, _c=<optimized out>, _id=10, _a=0x7ffeab1e8a00) at .moc/moc_qprocess.cpp:209
#25 0x00007f98b7a5e5ac in doActivate<false> (sender=0x5608920e6e40, signal_index=3, argv=argv@entry=0x7ffeab1e8a00) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qobject.cpp:3898
#26 0x00007f98b7a5798c in QMetaObject::activate (sender=sender@entry=0x5608920e6e40, m=m@entry=0x7f98b7d2d180 <QSocketNotifier::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7ffeab1e8a00) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qobject.cpp:3946
#27 0x00007f98b7a621d6 in QSocketNotifier::activated (this=this@entry=0x5608920e6e40, _t1=..., _t2=<optimized out>, _t3=...) at .moc/moc_qsocketnotifier.cpp:179
#28 0x00007f98b7a62a73 in QSocketNotifier::event (this=0x5608920e6e40, e=<optimized out>) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qsocketnotifier.cpp:302
#29 0x00007f98b85f96df in QApplicationPrivate::notify_helper (this=<optimized out>, receiver=0x5608920e6e40, e=0x7ffeab1e8b10) at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/src/widgets/kernel/qapplication.cpp:3632
#30 0x00007f98b7a25730 in QCoreApplication::notifyInternal2 (receiver=0x5608920e6e40, event=0x7ffeab1e8b10) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qcoreapplication.cpp:1063
#31 0x00007f98b7a80e8e in socketNotifierSourceDispatch (source=0x560890b63570) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qeventdispatcher_glib.cpp:107
#32 0x00007f98b5b0722b in g_main_dispatch (context=0x7f98ac005000) at ../glib-2.68.3/glib/gmain.c:3337
#33 g_main_context_dispatch (context=0x7f98ac005000) at ../glib-2.68.3/glib/gmain.c:4055
#34 0x00007f98b5b074e5 in g_main_context_iterate (context=context@entry=0x7f98ac005000, block=block@entry=1, dispatch=dispatch@entry=1, self=<optimized out>) at ../glib-2.68.3/glib/gmain.c:4131
#35 0x00007f98b5b075af in g_main_context_iteration (context=0x7f98ac005000, may_block=may_block@entry=1) at ../glib-2.68.3/glib/gmain.c:4196
#36 0x00007f98b7a7fe44 in QEventDispatcherGlib::processEvents (this=0x560890b7cc20, flags=...) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/src/corelib/kernel/qeventdispatcher_glib.cpp:423
#37 0x00007f98b7a23aab in QEventLoop::exec (this=this@entry=0x7ffeab1e8d20, flags=..., flags@entry=...) at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/global/qflags.h:69
#38 0x00007f98b7a2cbcd in QCoreApplication::exec () at /usr/src/debug/dev-qt/qtcore-5.15.2-r3/qtbase-everywhere-src-5.15.2/include/QtCore/../../src/corelib/global/qflags.h:121
#39 0x00007f98b7f1d15c in QGuiApplication::exec () at /usr/src/debug/dev-qt/qtgui-5.15.2-r2/qtbase-everywhere-src-5.15.2/src/gui/kernel/qguiapplication.cpp:1867
#40 0x00007f98b85f9645 in QApplication::exec () at /usr/src/debug/dev-qt/qtwidgets-5.15.2-r1/qtbase-everywhere-src-5.15.2/src/widgets/kernel/qapplication.cpp:2824
#41 0x000056088ecb68fa in main (argc=<optimized out>, argv=<optimized out>) at /usr/src/debug/kde-apps/kate-9999/kate-9999/kate/main.cpp:699
[Inferior 1 (process 804790) detached]

Merge request reports