diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2023-02-08 12:14:21 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2023-02-08 21:15:12 +0100 |
commit | f69b6f0940b178b46ecbaa5f0b4956ac44e8379e (patch) | |
tree | 1ca60786e29205166be5c8381c66da88fed6f85d /src/qml/qml/qqml.cpp | |
parent | ac5bbbe4aca5e1abef4972aeeba22c8c2f923705 (diff) |
QML: Fortify qmlExecuteDeferred some more
I don't know how to trigger this, but a recent crash report from the CI
shows that we can get there without a valid engine.
Pick-to: 6.5
Change-Id: I9f17894da82b8e7eab88181c96dfa8eaf7795523
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qml/qml/qqml.cpp')
-rw-r--r-- | src/qml/qml/qqml.cpp | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/src/qml/qml/qqml.cpp b/src/qml/qml/qqml.cpp index 6140a532f1..13654d0cb0 100644 --- a/src/qml/qml/qqml.cpp +++ b/src/qml/qml/qqml.cpp @@ -50,17 +50,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) |