Details
-
Bug
-
Resolution: Fixed
-
P1: Critical
-
Qt Creator 16.0.0
-
None
-
-
89534d318 (16.0), 8fb22881c (16.0)
Description
The setup of WindowsSettingsWidget::downloadNugetRecipe() is not safe. It can crash when the user presses cancel.
I can reliably reproduce this, if I add a sleep in
QObject::connect(&query, &NetworkQuery::downloadProgress,
progressDialog, [progressDialog](qint64 received, qint64 max) {
progressDialog->setRange(0, max);
QThread::sleep(1); // <--- added
progressDialog->setValue(received);
});
in WindowsSettingsWidget::downloadNugetRecipe(), and in the modified Qt Creator then start the download and press the cancel button in the progress dialog.
Interestingly the very similar code in androidsdkdownloader does not crash for me even with that modification.
Backtrace:
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread 0 QtWidgets 0x105f71368 QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData>>::get() const + 0 (qscopedpointer.h:112) [inlined] 1 QtWidgets 0x105f71368 decltype(fp.get()) qGetPtrHelper<QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData>> const>(QScopedPointer<QObjectData, QScopedPointerDeleter<QObjectData>> const&) + 0 (qtclasshelpermacros.h:103) [inlined] 2 QtWidgets 0x105f71368 QProgressBar::d_func() const + 0 (qprogressbar.h:81) [inlined] 3 QtWidgets 0x105f71368 QProgressBar::maximum() const + 0 (qprogressbar.cpp:272) 4 QtWidgets 0x10601ee3c QProgressDialog::setValue(int) + 516 (qprogressdialog.cpp:660) 5 libProjectExplorer.dylib 0x128aa538c ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)::operator()(long long, long long) const + 80 (windowsappsdksettings.cpp:356) 6 libProjectExplorer.dylib 0x128aa5330 QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)>::call(ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)&, void**)::'lambda'()::operator()() const + 60 (qobjectdefs_impl.h:141) 7 libProjectExplorer.dylib 0x128aa52e8 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)>::call(ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)&, void**)::'lambda'()>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)>::call(ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)&, void**)::'lambda'()&&) + 28 (qobjectdefs_impl.h:65) 8 libProjectExplorer.dylib 0x128aa52c0 QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)>::call(ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)&, void**) + 48 (qobjectdefs_impl.h:140) 9 libProjectExplorer.dylib 0x128aa5244 void QtPrivate::FunctorCallable<ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long), long long, long long>::call<QtPrivate::List<long long, long long>, void>(ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long)&, void*, void**) + 36 (qobjectdefs_impl.h:362) 10 libProjectExplorer.dylib 0x128aa51cc QtPrivate::QCallableObject<ProjectExplorer::Internal::WindowsSettingsWidget::downloadNugetRecipe()::$_0::operator()(Tasking::NetworkQuery&) const::'lambda'(long long, long long), QtPrivate::List<long long, long long>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) + 168 (qobjectdefs_impl.h:572) 11 QtCore 0x10662cfec QtPrivate::QSlotObjectBase::call(QObject*, void**) + 28 (qobjectdefs_impl.h:486) [inlined] 12 QtCore 0x10662cfec void doActivate<false>(QObject*, int, void**) + 1396 (qobject.cpp:4115) 13 libUtils.16.0.1.dylib 0x106d16158 Tasking::NetworkQuery::downloadProgress(long long, long long) + 84 (moc_networkquery.cpp:197) 14 libUtils.16.0.1.dylib 0x106cac894 QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, void (Tasking::NetworkQuery::*)(long long, long long)>::call(void (Tasking::NetworkQuery::*)(long long, long long), Tasking::NetworkQuery*, void**)::'lambda'()::operator()() const + 172 (qobjectdefs_impl.h:152) 15 libUtils.16.0.1.dylib 0x106cac770 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, void (Tasking::NetworkQuery::*)(long long, long long)>::call(void (Tasking::NetworkQuery::*)(long long, long long), Tasking::NetworkQuery*, void**)::'lambda'()>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, void (Tasking::NetworkQuery::*)(long long, long long)>::call(void (Tasking::NetworkQuery::*)(long long, long long), Tasking::NetworkQuery*, void**)::'lambda'()&&) + 28 (qobjectdefs_impl.h:65) 16 libUtils.16.0.1.dylib 0x106cac6c4 QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<long long, long long>, void, void (Tasking::NetworkQuery::*)(long long, long long)>::call(void (Tasking::NetworkQuery::*)(long long, long long), Tasking::NetworkQuery*, void**) + 112 (qobjectdefs_impl.h:151) 17 libUtils.16.0.1.dylib 0x106cac5f4 void QtPrivate::FunctionPointer<void (Tasking::NetworkQuery::*)(long long, long long)>::call<QtPrivate::List<long long, long long>, void>(void (Tasking::NetworkQuery::*)(long long, long long), Tasking::NetworkQuery*, void**) + 80 (qobjectdefs_impl.h:199) 18 libUtils.16.0.1.dylib 0x106cac4a8 QtPrivate::QCallableObject<void (Tasking::NetworkQuery::*)(long long, long long), QtPrivate::List<long long, long long>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) + 192 (qobjectdefs_impl.h:570) 19 QtCore 0x10662cfec QtPrivate::QSlotObjectBase::call(QObject*, void**) + 28 (qobjectdefs_impl.h:486) [inlined] 20 QtCore 0x10662cfec void doActivate<false>(QObject*, int, void**) + 1396 (qobject.cpp:4115) 21 QtNetwork 0x1063d0950 QNetworkReply::downloadProgress(long long, long long) + 68 (moc_qnetworkreply.cpp:492) 22 QtNetwork 0x10646a148 QNetworkReplyHttpImplPrivate::replyDownloadData(QByteArray) + 888 (qnetworkreplyhttpimpl.cpp:1173) 23 QtNetwork 0x10646cbe4 QNetworkReplyHttpImpl::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) + 1200 (moc_qnetworkreplyhttpimpl_p.cpp:313) 24 QtCore 0x106625500 QObject::event(QEvent*) + 644 (qobject.cpp:1418) 25 QtWidgets 0x105db0298 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 336 (qapplication.cpp:3296) 26 QtWidgets 0x105db1254 QApplication::notify(QObject*, QEvent*) + 504 (qapplication.cpp:3247) 27 QtCore 0x1065de390 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 200 (qcoreapplication.cpp:1172) 28 QtCore 0x1065df49c QCoreApplication::sendEvent(QObject*, QEvent*) + 16 (qcoreapplication.cpp:1612) [inlined] 29 QtCore 0x1065df49c QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) + 532 (qcoreapplication.cpp:1946) 30 libqcocoa.dylib 0x105bb114c QCocoaEventDispatcherPrivate::processPostedEvents() + 360 (qcocoaeventdispatcher.mm:904) 31 libqcocoa.dylib 0x105baf800 QCocoaEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 1008 (qcocoaeventdispatcher.mm:488) 32 libCore.dylib 0x118990bc8 Core::Internal::(anonymous namespace)::SettingsDialog::execDialog() + 448 (settingsdialog.cpp:806) 33 libCore.dylib 0x11899033c Core::Internal::executeSettingsDialog(QWidget*, Utils::Id) + 304 (settingsdialog.cpp:830) 34 libCore.dylib 0x118bfa2b8 Core::ICore::showOptionsDialog(Utils::Id, QWidget*) + 84 (icore.cpp:463) 35 libCore.dylib 0x118c2c3fc Core::Internal::ICorePrivate::registerDefaultActions()::$_5::operator()() const + 40 (icore.cpp:1953) 36 libCore.dylib 0x118c2c3c8 QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, Core::Internal::ICorePrivate::registerDefaultActions()::$_5>::call(Core::Internal::ICorePrivate::registerDefaultActions()::$_5&, void**)::'lambda'()::operator()() const + 28 (qobjectdefs_impl.h:141) 37 libCore.dylib 0x118c2c3a0 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, Core::Internal::ICorePrivate::registerDefaultActions()::$_5>::call(Core::Internal::ICorePrivate::registerDefaultActions()::$_5&, void**)::'lambda'()>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, Core::Internal::ICorePrivate::registerDefaultActions()::$_5>::call(Core::Internal::ICorePrivate::registerDefaultActions()::$_5&, void**)::'lambda'()&&) + 28 (qobjectdefs_impl.h:65) 38 libCore.dylib 0x118c2c378 QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, Core::Internal::ICorePrivate::registerDefaultActions()::$_5>::call(Core::Internal::ICorePrivate::registerDefaultActions()::$_5&, void**) + 40 (qobjectdefs_impl.h:140) 39 libCore.dylib 0x118c2c304 void QtPrivate::FunctorCallable<Core::Internal::ICorePrivate::registerDefaultActions()::$_5>::call<QtPrivate::List<>, void>(Core::Internal::ICorePrivate::registerDefaultActions()::$_5&, void*, void**) + 36 (qobjectdefs_impl.h:362) 40 libCore.dylib 0x118c2c274 QtPrivate::QCallableObject<Core::Internal::ICorePrivate::registerDefaultActions()::$_5, QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) + 164 (qobjectdefs_impl.h:572) 41 QtCore 0x10662cfec QtPrivate::QSlotObjectBase::call(QObject*, void**) + 28 (qobjectdefs_impl.h:486) [inlined] 42 QtCore 0x10662cfec void doActivate<false>(QObject*, int, void**) + 1396 (qobject.cpp:4115) 43 QtGui 0x10552fa18 QAction::triggered(bool) + 60 (moc_qaction.cpp:479) 44 libUtils.16.0.1.dylib 0x10720e68c QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<bool>, void, void (QAction::*)(bool)>::call(void (QAction::*)(bool), QAction*, void**)::'lambda'()::operator()() const + 160 (qobjectdefs_impl.h:152) 45 libUtils.16.0.1.dylib 0x10720e574 void QtPrivate::FunctorCallBase::call_internal<void, QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<bool>, void, void (QAction::*)(bool)>::call(void (QAction::*)(bool), QAction*, void**)::'lambda'()>(void**, QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<bool>, void, void (QAction::*)(bool)>::call(void (QAction::*)(bool), QAction*, void**)::'lambda'()&&) + 28 (qobjectdefs_impl.h:65) 46 libUtils.16.0.1.dylib 0x10720e4c8 QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<bool>, void, void (QAction::*)(bool)>::call(void (QAction::*)(bool), QAction*, void**) + 112 (qobjectdefs_impl.h:151) 47 libUtils.16.0.1.dylib 0x10720e40c void QtPrivate::FunctionPointer<void (QAction::*)(bool)>::call<QtPrivate::List<bool>, void>(void (QAction::*)(bool), QAction*, void**) + 80 (qobjectdefs_impl.h:199) 48 libUtils.16.0.1.dylib 0x10720e2fc QtPrivate::QCallableObject<void (QAction::*)(bool), QtPrivate::List<bool>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) + 192 (qobjectdefs_impl.h:570) 49 QtCore 0x10662cfec QtPrivate::QSlotObjectBase::call(QObject*, void**) + 28 (qobjectdefs_impl.h:486) [inlined] 50 QtCore 0x10662cfec void doActivate<false>(QObject*, int, void**) + 1396 (qobject.cpp:4115) 51 QtGui 0x10552f8ac QAction::activate(QAction::ActionEvent) + 368 52 QtCore 0x106625500 QObject::event(QEvent*) + 644 (qobject.cpp:1418) 53 QtWidgets 0x105db0298 QApplicationPrivate::notify_helper(QObject*, QEvent*) + 336 (qapplication.cpp:3296) 54 QtWidgets 0x105db1254 QApplication::notify(QObject*, QEvent*) + 504 (qapplication.cpp:3247) 55 QtCore 0x1065de390 QCoreApplication::notifyInternal2(QObject*, QEvent*) + 200 (qcoreapplication.cpp:1172) 56 QtCore 0x1065df49c QCoreApplication::sendEvent(QObject*, QEvent*) + 16 (qcoreapplication.cpp:1612) [inlined] 57 QtCore 0x1065df49c QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) + 532 (qcoreapplication.cpp:1946) 58 libqcocoa.dylib 0x105bb114c QCocoaEventDispatcherPrivate::processPostedEvents() + 360 (qcocoaeventdispatcher.mm:904) 59 libqcocoa.dylib 0x105bb2398 QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void*) + 476 (qcocoaeventdispatcher.mm:926) 60 CoreFoundation 0x18d8c08a4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 28 61 CoreFoundation 0x18d8c0838 __CFRunLoopDoSource0 + 176 62 CoreFoundation 0x18d8c059c __CFRunLoopDoSources0 + 244 63 CoreFoundation 0x18d8bf138 __CFRunLoopRun + 840 64 CoreFoundation 0x18d8be734 CFRunLoopRunSpecific + 588 65 HIToolbox 0x198e2d530 RunCurrentEventLoopInMode + 292 66 HIToolbox 0x198e3317c ReceiveNextEventCommon + 216 67 HIToolbox 0x198e33508 _BlockUntilNextEventMatchingListInModeWithFilter + 76 68 AppKit 0x191436848 _DPSNextEvent + 660 69 AppKit 0x191d9cc24 -[NSApplication(NSEventRouting) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 688 70 AppKit 0x191429874 -[NSApplication run] + 480 71 libqcocoa.dylib 0x105bafc84 QCocoaEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 2164 (qcocoaeventdispatcher.mm:407) 72 QtCore 0x1065e8378 QEventLoop::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) + 36 (qeventloop.cpp:103) [inlined] 73 QtCore 0x1065e8378 QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 596 (qeventloop.cpp:185) 74 QtCore 0x1065deb6c QCoreApplication::exec() + 144 (qcoreapplication.cpp:1515) 75 Qt Creator 0x1048b95c8 main + 19036 (main.cpp:1026) 76 dyld 0x18d458274 start + 2840
Attachments
Issue Links
- resulted in
-
QTBUG-135797 Make calling processEvents() from inside QProgressDialog::setValue() optional
-
- Reported
-
- mentioned in
-
Page Loading...