QFileSystemWatcher: fix QWindowsFileSystemWatcherEngine crashes

Since QHash in Qt6 does not guarantee stable iterators after
an insert it crashed from time to time.
- possible crash at the erase call if pit is invalid
- possible crash at insert if pit is invalid

QHash<QString, int> myHash;
auto i = myHash.find("foo");
myHash.insert("foo", 789);
i.value(); // possible crash
myHash.erase(i); // possible crash

Task-number: QTBUG-96790
Change-Id: Ia9b53d46b8d1fef81ab5a130c229bc9e936f6521
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
(cherry picked from commit e60951eef4f0ade944e2f93ffe2f44abfc76d97a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Tim Jenssen 2021-09-22 11:47:22 +02:00 committed by Qt Cherry-pick Bot
parent acaf38cfe4
commit fc6eb0bb7e

View File

@ -430,8 +430,9 @@ QStringList QWindowsFileSystemWatcherEngine::addPaths(const QStringList &paths,
FindCloseChangeNotification(hit.value().handle); FindCloseChangeNotification(hit.value().handle);
thread->handles[index] = hit.value().handle = fileHandle; thread->handles[index] = hit.value().handle = fileHandle;
hit.value().flags = flags; hit.value().flags = flags;
thread->pathInfoForHandle.insert(fileHandle, pit.value()); auto value = std::move(*pit);
thread->pathInfoForHandle.erase(pit); thread->pathInfoForHandle.erase(pit);
thread->pathInfoForHandle.insert(fileHandle, std::move(value));
} }
} }
// In addition, check on flags for sufficient notification attributes // In addition, check on flags for sufficient notification attributes