QML: fortify qmlExecuteDeferred some more
authorDebian Qt/KDE Maintainers <debian-qt-kde@lists.debian.org>
Thu, 7 Nov 2024 08:47:17 +0000 (11:47 +0300)
committerDmitry Shachnev <mitya57@debian.org>
Thu, 7 Nov 2024 08:47:17 +0000 (11:47 +0300)
Origin: upstream, https://code.qt.io/cgit/qt/qtdeclarative.git/commit/?id=f69b6f0940b178b4
Last-Update: 2024-11-07

Gbp-Pq: Name fortify_qmlexecutedeferred.patch

src/qml/qml/qqmlengine.cpp

index 852a673ebd6c158a3ed32f1ab571016705015d6b..c9f1b117e7ef5884c3d2630c62b98671e8017df6 100644 (file)
@@ -1588,17 +1588,23 @@ void qmlExecuteDeferred(QObject *object)
 {
     QQmlData *data = QQmlData::get(object);
 
-    if (data && !data->deferredData.isEmpty() && !data->wasDeleted(object)) {
-        QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine);
+    if (!data
+            || !data->context
+            || !data->context->engine
+            || data->deferredData.isEmpty()
+            || data->wasDeleted(object)) {
+        return;
+    }
 
-        QQmlComponentPrivate::DeferredState state;
-        QQmlComponentPrivate::beginDeferred(ep, object, &state);
+    QQmlEnginePrivate *ep = QQmlEnginePrivate::get(data->context->engine);
 
-        // Release the reference for the deferral action (we still have one from construction)
-        data->releaseDeferredData();
+    QQmlComponentPrivate::DeferredState state;
+    QQmlComponentPrivate::beginDeferred(ep, object, &state);
 
-        QQmlComponentPrivate::completeDeferred(ep, &state);
-    }
+    // Release the reference for the deferral action (we still have one from construction)
+    data->releaseDeferredData();
+
+    QQmlComponentPrivate::completeDeferred(ep, &state);
 }
 
 QQmlContext *qmlContext(const QObject *obj)