mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-08-14 10:34:14 +02:00
39ac5716c7
Bugtracker #291: clicking Cancel on the open/save-element dialog before the user collection finishes loading crashes the whole application with an unhandled pointer exception. ElementsCollectionModel::loadCollections() loads collections in the background via QtConcurrent::map(m_items_list_to_setUp, setUpData) - worker threads call setUpData() on each ElementCollectionItem (a QStandardItem), which does setFlags()/setData() on it. ElementDialog::execConfiguredDialog() deletes the dialog immediately after exec() returns: element_dialog->exec(); ... delete element_dialog; That destroys the tree view and its ElementsCollectionModel, which as a QStandardItemModel frees all its items in its destructor. Nothing waited for the QtConcurrent::map() to finish first, so on Cancel before loading completes, background threads were still calling setUpData() on items the main thread had just freed - a use-after-free race. Add an ElementsCollectionModel destructor that waits for the future before QStandardItemModel's destructor runs. QFuture::waitForFinished() on a default-constructed (never-started) future returns immediately, so this is a no-op whenever loading already completed - the crash path is the only one affected.