From 400426c3888bbf539cc13e8e2af673198f12c9a9 Mon Sep 17 00:00:00 2001 From: Vladimir Belyavsky Date: Fri, 30 Aug 2024 22:09:52 +0300 Subject: [PATCH] QCocoaScreen: Account for platform window deletion during deliverUpdateRequest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Platform window may be destroyed during update request delivery. For instance, in Qt Quick a user may close a window using some animation with QML ScriptAction. To handle such a situation and prevent a crash due to a dangling pointer, we can simply protect the platformWindow pointer using QPointer. Fixes: QTBUG-128516 Pick-to: 6.7 6.5 Change-Id: I49ecec09d62e184f5df17794b303f147b705e2e3 Reviewed-by: Tor Arne Vestbø (cherry picked from commit 2ef1a338a91659871675514921f9a7dc8d1c8805) Reviewed-by: Qt Cherry-pick Bot --- src/plugins/platforms/cocoa/qcocoascreen.mm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/platforms/cocoa/qcocoascreen.mm b/src/plugins/platforms/cocoa/qcocoascreen.mm index 55526d6cdc7..bdecf6fa80d 100644 --- a/src/plugins/platforms/cocoa/qcocoascreen.mm +++ b/src/plugins/platforms/cocoa/qcocoascreen.mm @@ -421,22 +421,26 @@ void QCocoaScreen::deliverUpdateRequests() auto windows = QGuiApplication::allWindows(); for (int i = 0; i < windows.size(); ++i) { QWindow *window = windows.at(i); - auto *platformWindow = static_cast(window->handle()); + if (window->screen() != screen()) + continue; + + QPointer platformWindow = static_cast(window->handle()); if (!platformWindow) continue; if (!platformWindow->hasPendingUpdateRequest()) continue; - if (window->screen() != screen()) - continue; - // Skip windows that are not doing update requests via display link if (!platformWindow->updatesWithDisplayLink()) continue; platformWindow->deliverUpdateRequest(); + // platform window can be destroyed in deliverUpdateRequest() + if (!platformWindow) + continue; + // Another update request was triggered, keep the display link running if (platformWindow->hasPendingUpdateRequest()) pauseUpdates = false;