diff options
author | Aurélien Brooke <[email protected]> | 2025-08-14 08:45:05 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <[email protected]> | 2025-08-16 04:23:14 +0000 |
commit | 367abce44eaf56d8306c604b5ec5deec962ea8c2 (patch) | |
tree | 74d79784290d75db550b3c96a5295f03c3ead3d5 | |
parent | 874335b184faec6006dce3966b9b541e9068f11f (diff) |
QQmlValueTypeWrapper: fix stack-use-after-return and missing destructor6.9
If isReference() is true and we allocate a gadgetPtr() on the stack with
alloca(), then when readReferenceValue() fails, we return immediately,
leaving a bad pointer in d()->gadgetPtr():
- gadgetPtr now references alloca() memory from a function that returned
- the destructor of the gadget is never called
To fix this, ensure that we destruct and nullptr the gadget on all exit
paths, thanks to a qScopeGuard().
Pick-to: 6.8 6.5
Change-Id: I4ff411c0f364ad337fdbd55772812e1f219e6dff
Reviewed-by: Ulf Hermann <[email protected]>
(cherry picked from commit 0d67a8c45232e95de86fe66975f6ec3e07ec2aa9)
Reviewed-by: Qt Cherry-pick Bot <[email protected]>
(cherry picked from commit 63d8a9d1c9c89c60943c066676f8d434344d561c)
-rw-r--r-- | src/qml/qml/qqmlvaluetypewrapper.cpp | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/qml/qml/qqmlvaluetypewrapper.cpp b/src/qml/qml/qqmlvaluetypewrapper.cpp index 6d89ec6444..6e965f2115 100644 --- a/src/qml/qml/qqmlvaluetypewrapper.cpp +++ b/src/qml/qml/qqmlvaluetypewrapper.cpp @@ -543,6 +543,13 @@ QMetaType QQmlValueTypeWrapper::type() const bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const { bool destructGadgetOnExit = false; + auto cleanup = qScopeGuard([&]() { + if (destructGadgetOnExit) { + d()->metaType().destruct(d()->gadgetPtr()); + d()->setGadgetPtr(nullptr); + } + }); + Q_ALLOCA_DECLARE(void, gadget); if (d()->isReference()) { if (!d()->gadgetPtr()) { @@ -559,11 +566,6 @@ bool QQmlValueTypeWrapper::write(QObject *target, int propertyIndex) const int status = -1; void *a[] = { d()->gadgetPtr(), nullptr, &status, &flags }; QMetaObject::metacall(target, QMetaObject::WriteProperty, propertyIndex, a); - - if (destructGadgetOnExit) { - d()->metaType().destruct(d()->gadgetPtr()); - d()->setGadgetPtr(nullptr); - } return true; } |