Uploaded image for project: 'Qt Creator'
  1. Qt Creator
  2. QTCREATORBUG-32746

Crash on cancelling NuGet download

    XMLWordPrintable

Details

    • Windows
    • 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

          No reviews matched the request. Check your Options in the drop-down menu of this sections header.

          Activity

            People

              jkobus Jarek Kobus
              con Eike Ziller
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Gerrit Reviews

                  There are no open Gerrit changes