https://bugs.kde.org/show_bug.cgi?id=427378

            Bug ID: 427378
           Summary: Segfault in ProjectFileDataProvider::projectOpened()'s
                    nested event loop when exiting KDevelop right after a
                    large project is opened
           Product: kdevelop
           Version: git master
          Platform: Compiled Sources
                OS: Linux
            Status: REPORTED
          Severity: crash
          Priority: NOR
         Component: UI: QuickOpen
          Assignee: kdevelop-bugs-n...@kde.org
          Reporter: igor...@gmail.com
  Target Milestone: ---

SUMMARY
When a user exits KDevelop right after a large project is opened, before
ProjectFileDataProvider::projectOpened() slot returns,
IProjectController::projectClosing() signal is emitted before some slots
connected to IProjectController::projectOpened() signal ale invoked (more
precisely, the slots that were connected to projectOpened() signal later than
the ProjectFileDataProvider::projectOpened() slot). Thus a valid assumption
that a slot connected to projectOpened() is always called before a slot
connected to projectClosing() becomes incorrect and causes a segmentation fault
in ClassModel::removeProjectNode().

STEPS TO REPRODUCE
1. Open a large project with tens of thousands of files, such as KDevelop
itself.
2. Exit KDevelop as soon as the just opened project appears in Projects tool
view.

SOFTWARE/OS VERSIONS
Manjaro GNU/Linux, Xfce
KDE Frameworks Version: 5.74.0
Qt Version: 5.15.1

ADDITIONAL INFORMATION
I am going to create a Merge Request with a fix soon.

BACKTRACE (RelWithDebInfo)
Application: KDevelop (kdevelop), signal: Segmentation fault
Using host libthread_db library "/usr/lib/libthread_db.so.1".
[Current thread is 1 (Thread 0x7f3bdd900580 (LWP 40040))]

Thread 1 (Thread 0x7f3bdd900580 (LWP 40040)):
[KCrash Handler]
#6  0x00007f3bf519a711 in ClassModelNodes::Node::row() (this=0x0) at
../kdevplatform/language/classmodel/classmodelnode.cpp:487
#7  0x00007f3bf519a514 in
ClassModelNodes::Node::removeNode(ClassModelNodes::Node*) (this=0x559e9ad20ae0,
a_child=0x0) at ../kdevplatform/language/classmodel/classmodelnode.cpp:446
#8  0x00007f3bf51967c0 in ClassModel::removeProjectNode(KDevelop::IProject*)
(this=0x559e9ad20aa0, project=0x559e9d2c3760) at
../kdevplatform/language/classmodel/classmodel.cpp:272
#9  0x00007f3bf5197fa9 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>,
QtPrivate::List<KDevelop::IProject*>, void, void
(ClassModel::*)(KDevelop::IProject*)>::call(void
(ClassModel::*)(KDevelop::IProject*), ClassModel*, void**) (f=(void
(ClassModel::*)(ClassModel * const, KDevelop::IProject *)) 0x7f3bf5196772
<ClassModel::removeProjectNode(KDevelop::IProject*)>, o=0x559e9ad20aa0,
arg=0x7ffc5526f790) at /usr/include/qt/QtCore/qobjectdefs_impl.h:152
#10 0x00007f3bf5197dfd in QtPrivate::FunctionPointer<void
(ClassModel::*)(KDevelop::IProject*)>::call<QtPrivate::List<KDevelop::IProject*>,
void>(void (ClassModel::*)(KDevelop::IProject*), ClassModel*, void**) (f=(void
(ClassModel::*)(ClassModel * const, KDevelop::IProject *)) 0x7f3bf5196772
<ClassModel::removeProjectNode(KDevelop::IProject*)>, o=0x559e9ad20aa0,
arg=0x7ffc5526f790) at /usr/include/qt/QtCore/qobjectdefs_impl.h:185
#11 0x00007f3bf519791a in QtPrivate::QSlotObject<void
(ClassModel::*)(KDevelop::IProject*), QtPrivate::List<KDevelop::IProject*>,
void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*)
(which=1, this_=0x559e9ad1d730, r=0x559e9ad20aa0, a=0x7ffc5526f790, ret=0x0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:414
#12 0x00007f3bf21fd50e in  () at /usr/lib/libQt5Core.so.5
#13 0x00007f3bf4cc18da in
KDevelop::IProjectController::projectClosing(KDevelop::IProject*)
(this=0x559e97168110, _t1=0x559e9d2c3760) at
kdevplatform/interfaces/KDevPlatformInterfaces_autogen/EWIEGA46WW/moc_iprojectcontroller.cpp:273
#14 0x00007f3bf61ed683 in
KDevelop::ProjectController::takeProject(KDevelop::IProject*)
(this=0x559e97168110, proj=0x559e9d2c3760) at
../kdevplatform/shell/projectcontroller.cpp:1070
#15 0x00007f3bf61ed759 in
KDevelop::ProjectController::closeProject(KDevelop::IProject*)
(this=0x559e97168110, proj=0x559e9d2c3760) at
../kdevplatform/shell/projectcontroller.cpp:1090
#16 0x00007f3bf61ed81e in KDevelop::ProjectController::closeAllProjects()
(this=0x559e97168110) at ../kdevplatform/shell/projectcontroller.cpp:1100
#17 0x00007f3bf61ea918 in KDevelop::ProjectController::cleanup()
(this=0x559e97168110) at ../kdevplatform/shell/projectcontroller.cpp:665
#18 0x00007f3bf61d9c6d in KDevelop::Core::cleanup() (this=0x559e97676230) at
../kdevplatform/shell/core.cpp:395
#19 0x00007f3bf61d996e in KDevelop::Core::shutdown() (this=0x559e97676230) at
../kdevplatform/shell/core.cpp:356
#20 0x00007f3bf61b47e3 in KDevelop::MainWindow::~MainWindow()
(this=0x559e97695730, __in_chrg=<optimized out>, __vtt_parm=<optimized out>) at
../kdevplatform/shell/mainwindow.cpp:150
#21 0x00007f3bf61b48a6 in KDevelop::MainWindow::~MainWindow()
(this=0x559e97695730, __in_chrg=<optimized out>, __vtt_parm=<optimized out>) at
../kdevplatform/shell/mainwindow.cpp:154
#22 0x00007f3bf21f50a0 in QObject::event(QEvent*) () at
/usr/lib/libQt5Core.so.5
#23 0x00007f3bf30ac439 in QWidget::event(QEvent*) () at
/usr/lib/libQt5Widgets.so.5
#24 0x00007f3bf31c6515 in QMainWindow::event(QEvent*) () at
/usr/lib/libQt5Widgets.so.5
#25 0x00007f3bf3d1fefc in KMainWindow::event(QEvent*) () at
/usr/lib/libKF5XmlGui.so.5
#26 0x00007f3bf3d6b578 in KXmlGuiWindow::event(QEvent*) () at
/usr/lib/libKF5XmlGui.so.5
#27 0x00007f3bf61b4de3 in KDevelop::MainWindow::event(QEvent*)
(this=0x559e97695730, ev=0x559e9d3a63e0) at
../kdevplatform/shell/mainwindow.cpp:208
#28 0x00007f3bf3068362 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
() at /usr/lib/libQt5Widgets.so.5
#29 0x00007f3bf3071819 in QApplication::notify(QObject*, QEvent*) () at
/usr/lib/libQt5Widgets.so.5
#30 0x00007f3bf21c7a12 in QCoreApplication::notifyInternal2(QObject*, QEvent*)
() at /usr/lib/libQt5Core.so.5
#31 0x00007f3bf21ca276 in QCoreApplicationPrivate::sendPostedEvents(QObject*,
int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#32 0x00007f3bf2220a84 in  () at /usr/lib/libQt5Core.so.5
#33 0x00007f3befcfd9be in g_main_context_dispatch () at
/usr/lib/libglib-2.0.so.0
#34 0x00007f3befcff831 in  () at /usr/lib/libglib-2.0.so.0
#35 0x00007f3befcff871 in g_main_context_iteration () at
/usr/lib/libglib-2.0.so.0
#36 0x00007f3bf2220143 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
at /usr/lib/libQt5Core.so.5
#37 0x00007f3bc59b7124 in
ProjectFileDataProvider::projectOpened(KDevelop::IProject*)
(this=0x559e98cdbb00, project=0x559e9d2c3760) at
../plugins/quickopen/projectfilequickopen.cpp:248
#38 0x00007f3bc59c092f in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>,
QtPrivate::List<KDevelop::IProject*>, void, void
(ProjectFileDataProvider::*)(KDevelop::IProject*)>::call(void
(ProjectFileDataProvider::*)(KDevelop::IProject*), ProjectFileDataProvider*,
void**) (f=(void (ProjectFileDataProvider::*)(ProjectFileDataProvider * const,
KDevelop::IProject *)) 0x7f3bc59b702e
<ProjectFileDataProvider::projectOpened(KDevelop::IProject*)>,
o=0x559e98cdbb00, arg=0x7ffc552702f0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:152
#39 0x00007f3bc59bf2fe in QtPrivate::FunctionPointer<void
(ProjectFileDataProvider::*)(KDevelop::IProject*)>::call<QtPrivate::List<KDevelop::IProject*>,
void>(void (ProjectFileDataProvider::*)(KDevelop::IProject*),
ProjectFileDataProvider*, void**) (f=(void
(ProjectFileDataProvider::*)(ProjectFileDataProvider * const,
KDevelop::IProject *)) 0x7f3bc59b702e
<ProjectFileDataProvider::projectOpened(KDevelop::IProject*)>,
o=0x559e98cdbb00, arg=0x7ffc552702f0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:185
#40 0x00007f3bc59bdbc4 in QtPrivate::QSlotObject<void
(ProjectFileDataProvider::*)(KDevelop::IProject*),
QtPrivate::List<KDevelop::IProject*>, void>::impl(int,
QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1,
this_=0x559e98cdcaf0, r=0x559e98cdbb00, a=0x7ffc552702f0, ret=0x0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:414
#41 0x00007f3bf21fd50e in  () at /usr/lib/libQt5Core.so.5
#42 0x00007f3bf4cc1864 in
KDevelop::IProjectController::projectOpened(KDevelop::IProject*)
(this=0x559e97168110, _t1=0x559e9d2c3760) at
kdevplatform/interfaces/KDevPlatformInterfaces_autogen/EWIEGA46WW/moc_iprojectcontroller.cpp:266
#43 0x00007f3bf61ecf38 in
KDevelop::ProjectController::projectImportingFinished(KDevelop::IProject*)
(this=0x559e97168110, project=0x559e9d2c3760) at
../kdevplatform/shell/projectcontroller.cpp:1000
#44 0x00007f3bf62058a3 in KDevelop::ProjectPrivate::importDone(KJob*)
(this=0x559e9d2c5a00, job=0x559e9cb327c0) at
../kdevplatform/shell/project.cpp:221
#45 0x00007f3bf62030e4 in KDevelop::Project::<lambda(KJob*)>::operator()(KJob
*) const (__closure=0x559e9cb36f10, job=0x559e9cb327c0) at
../kdevplatform/shell/project.cpp:548
#46 0x00007f3bf620525b in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>,
QtPrivate::List<KJob*>, void, KDevelop::Project::open(const
KDevelop::Path&)::<lambda(KJob*)> >::call(KDevelop::Project::<lambda(KJob*)> &,
void **) (f=..., arg=0x7ffc552705b0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:146
#47 0x00007f3bf62051b3 in QtPrivate::Functor<KDevelop::Project::open(const
KDevelop::Path&)::<lambda(KJob*)>, 1>::call<QtPrivate::List<KJob*>,
void>(KDevelop::Project::<lambda(KJob*)> &, void *, void **) (f=...,
arg=0x7ffc552705b0) at /usr/include/qt/QtCore/qobjectdefs_impl.h:256
#48 0x00007f3bf6205157 in
QtPrivate::QFunctorSlotObject<KDevelop::Project::open(const
KDevelop::Path&)::<lambda(KJob*)>, 1, QtPrivate::List<KJob*>, void>::impl(int,
QtPrivate::QSlotObjectBase *, QObject *, void **, bool *) (which=1,
this_=0x559e9cb36f00, r=0x559e9d2c3760, a=0x7ffc552705b0, ret=0x0) at
/usr/include/qt/QtCore/qobjectdefs_impl.h:439
#49 0x00007f3bf21fd50e in  () at /usr/lib/libQt5Core.so.5
#50 0x00007f3bf26f4e4d in KJob::result(KJob*, KJob::QPrivateSignal) () at
/usr/lib/libKF5CoreAddons.so.5
#51 0x00007f3bf26f593c in KJob::finishJob(bool) () at
/usr/lib/libKF5CoreAddons.so.5
#52 0x00007f3bf4d2f52a in KDevelop::ExecuteCompositeJob::slotResult(KJob*)
(this=0x559e9cb327c0, job=0x559e9ccb82b0) at
../kdevplatform/util/executecompositejob.cpp:129
#53 0x00007f3bf21fd50e in  () at /usr/lib/libQt5Core.so.5
#54 0x00007f3bf26f4e4d in KJob::result(KJob*, KJob::QPrivateSignal) () at
/usr/lib/libKF5CoreAddons.so.5
#55 0x00007f3bf26f593c in KJob::finishJob(bool) () at
/usr/lib/libKF5CoreAddons.so.5
#56 0x00007f3bf1948aa5 in
KDevelop::FileManagerListJob::handleResults(QList<KIO::UDSEntry> const&)
(this=0x559e9ccb82b0, entriesIn=...) at
../kdevplatform/project/filemanagerlistjob.cpp:196
#57 0x00007f3bf1914a43 in
KDevelop::FileManagerListJob::qt_static_metacall(QObject*, QMetaObject::Call,
int, void**) (_o=0x559e9ccb82b0, _c=QMetaObject::InvokeMetaMethod, _id=4,
_a=0x559e9d5bbc48) at
kdevplatform/project/KDevPlatformProject_autogen/EWIEGA46WW/moc_filemanagerlistjob.cpp:108
#58 0x00007f3bf21f530a in QObject::event(QEvent*) () at
/usr/lib/libQt5Core.so.5
#59 0x00007f3bf3068362 in QApplicationPrivate::notify_helper(QObject*, QEvent*)
() at /usr/lib/libQt5Widgets.so.5
#60 0x00007f3bf3071819 in QApplication::notify(QObject*, QEvent*) () at
/usr/lib/libQt5Widgets.so.5
#61 0x00007f3bf21c7a12 in QCoreApplication::notifyInternal2(QObject*, QEvent*)
() at /usr/lib/libQt5Core.so.5
#62 0x00007f3bf21ca276 in QCoreApplicationPrivate::sendPostedEvents(QObject*,
int, QThreadData*) () at /usr/lib/libQt5Core.so.5
#63 0x00007f3bf2220a84 in  () at /usr/lib/libQt5Core.so.5
#64 0x00007f3befcfd9be in g_main_context_dispatch () at
/usr/lib/libglib-2.0.so.0
#65 0x00007f3befcff831 in  () at /usr/lib/libglib-2.0.so.0
#66 0x00007f3befcff871 in g_main_context_iteration () at
/usr/lib/libglib-2.0.so.0
#67 0x00007f3bf22200d0 in
QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) ()
at /usr/lib/libQt5Core.so.5
#68 0x00007f3bf21c657c in
QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at
/usr/lib/libQt5Core.so.5
#69 0x00007f3bf21ce586 in QCoreApplication::exec() () at
/usr/lib/libQt5Core.so.5
#70 0x0000559e96202588 in main(int, char**) (argc=3, argv=0x7ffc55271218) at
../app/main.cpp:850
[Inferior 1 (process 40040) detached]

-- 
You are receiving this mail because:
You are watching all bug changes.

Reply via email to