From 4fa12d8553b7d060a771a249bb13025541d354fc Mon Sep 17 00:00:00 2001 From: Frederik Gladhorn Date: Thu, 5 Jul 2018 11:28:32 +0200 Subject: [PATCH] Fix deletion of items in QAccessibleCache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Items in the cache may be part of the parent/child hierarchy. Make sure not to have dangling pointers in the cache, but rather cleanly remove all interfaces that get deleted since they may delete each other (TabBar deletes its child interfaces for example. Task-number: QTBUG-69283 Change-Id: Iad17cd1d3356804b3d8cbba8632ec22b836c3521 Reviewed-by: Christian Stenger Reviewed-by: Morten Johan Sørvig --- src/gui/accessible/qaccessiblecache.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/gui/accessible/qaccessiblecache.cpp b/src/gui/accessible/qaccessiblecache.cpp index f11883c370..a6b2d4cde4 100644 --- a/src/gui/accessible/qaccessiblecache.cpp +++ b/src/gui/accessible/qaccessiblecache.cpp @@ -59,8 +59,8 @@ static void cleanupAccessibleCache() QAccessibleCache::~QAccessibleCache() { - for (QAccessibleInterface *iface: idToInterface.values()) - delete iface; + for (QAccessible::Id id: idToInterface.keys()) + deleteInterface(id); } QAccessibleCache *QAccessibleCache::instance() @@ -137,6 +137,8 @@ void QAccessibleCache::objectDestroyed(QObject* obj) void QAccessibleCache::deleteInterface(QAccessible::Id id, QObject *obj) { QAccessibleInterface *iface = idToInterface.take(id); + if (!iface) // the interface may be deleted already + return; interfaceToId.take(iface); if (!obj) obj = iface->object();