summaryrefslogtreecommitdiff
blob: 7d13d2fa1bfa0a74733aef0294d11b18fd42d74d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
From 29dabab2f536827bc1ecec63f5a0b0a76f0809e5 Mon Sep 17 00:00:00 2001
From: David Edmundson <kde@davidedmundson.co.uk>
Date: Tue, 9 Mar 2021 14:30:44 +0000
Subject: [PATCH] Fix potential crash in SizeGroup

SizeGroup keeps a cache of a list of items, and when one updates does
calculations based on all items.

This list is stored as a list of QPointers as we don't explicitly track
deletion.

We have a list of items and guard for deletion, but they're QML owned.
So there's a point in time when it's pending deletion with the garbage
collector but the lower level object isn't managed by an engine.

As we go via QQmlProperty(item, QStringLiteral("Layout.preferredWidth"),
qmlContext(item)).write(maxWidth) this is problematic.

BUG: 434079
---
 src/sizegroup.cpp | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/sizegroup.cpp b/src/sizegroup.cpp
index 2035b6eb..a9a0ebf8 100644
--- a/src/sizegroup.cpp
+++ b/src/sizegroup.cpp
@@ -98,6 +98,10 @@ void SizeGroup::adjustItems(Mode whatChanged)
             continue;
         }
 
+        if (!qmlEngine(item)) {
+            continue;
+        }
+
         switch (m_mode) {
         case Mode::Width:
             QQmlProperty(item, QStringLiteral("Layout.preferredWidth"), qmlContext(item)).write(maxWidth);
-- 
GitLab