Fix crash in QQmlDebugService::objectForLocationInfo()
authorDuncan Cunningham <duncanc4@gmail.com>
Wed, 31 Jul 2013 22:12:24 +0000 (17:12 -0500)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Mon, 5 Aug 2013 15:00:05 +0000 (17:00 +0200)
Fixed crash in QQmlDebugService::objectForLocationInfo() where it
was using QObject pointers in the object reference id hash
table that had been deleted.  Now objectForLocationInfo() checks if
the QObject has been deleted and removes it from the object
reference hash before trying to look up the filename, line number,
and column number.

Change-Id: Iba7be7c490e97a2e7685685b0c6e501cfe1e833e
Reviewed-by: Alan Alpert (Personal) <416365416c@gmail.com>
Reviewed-by: Aurindam Jana <aurindam.jana@digia.com>
src/qml/debugger/qqmldebugservice.cpp

index f9a8090..f036dd9 100644 (file)
@@ -215,25 +215,25 @@ QList<QObject*> QQmlDebugService::objectForLocationInfo(const QString &filename,
 {
     ObjectReferenceHash *hash = objectReferenceHash();
     QList<QObject*> objects;
-    QHash<int, QObject *>::Iterator iter;
-    for (iter = hash->ids.begin(); iter != hash->ids.end(); ++iter) {
-        QQmlData *ddata = QQmlData::get(iter.value());
-        if (!ddata || !ddata->outerContext)
-            continue;
-        //column number may be different due to qmlrewriter
-        if (QFileInfo(ddata->outerContext->urlString).fileName() == filename &&
-                ddata->lineNumber == lineNumber &&
-                ddata->columnNumber >= columnNumber) {
-            QHash<QObject *, ObjectReference>::Iterator objIter =
-                    hash->objects.find(*iter);
-            Q_ASSERT(objIter != hash->objects.end());
-
-            if (objIter->object == 0) {
-                hash->ids.erase(iter);
-                hash->objects.erase(objIter);
-            } else {
-                objects << *iter;
+    QHash<int, QObject *>::Iterator iter = hash->ids.begin();
+    while (iter != hash->ids.end()) {
+        QHash<QObject *, ObjectReference>::Iterator objIter =
+                hash->objects.find(*iter);
+        Q_ASSERT(objIter != hash->objects.end());
+
+        if (objIter->object == 0) {
+            iter = hash->ids.erase(iter);
+            hash->objects.erase(objIter);
+        } else {
+            QQmlData *ddata = QQmlData::get(iter.value());
+            if (ddata && ddata->outerContext) {
+                if (QFileInfo(ddata->outerContext->urlString).fileName() == filename &&
+                    ddata->lineNumber == lineNumber &&
+                    ddata->columnNumber >= columnNumber) {
+                    objects << *iter;
+                }
             }
+            ++iter;
         }
     }
     return objects;