From 676d4511d95a6059adfcb1fb4fce5923b53e1093 Mon Sep 17 00:00:00 2001 From: Christian Cwienk Date: Sun, 30 Aug 2026 16:16:43 +0200 Subject: [PATCH] FE/Qt: Do not wildcard-disconnect the synthetic work-area workers r173930 introduced 'pWorker->disconnect(); pWorker->deleteLater();' for the UIInvisibleWindow helpers used to measure host-screen available geometry. The no-argument disconnect() is a wildcard and also removes Qt's internal destroyed() connections, which Qt warns about: QObject::disconnect: wildcard call disconnects from destroyed signal of UIInvisibleWindow::unnamed With that bookkeeping gone, any host work-area change can crash the frontend while the replacement worker is being created: QAccessibleWidget::text() <- QWidgetPrivate::setWindowTitle_sys() <- QWidgetPrivate::create() <- QWidget::showMaximized() <- UIDesktopWidgetWatchdog::sltHandleHostScreenWorkAreaResized() No monitor hotplug, suspend/resume or DPMS transition is needed; on X11 an ordinary _NET_WORKAREA change (a desktop panel hiding, or the shell being restarted) is sufficient and reproduces on the first attempt. Disconnect only the worker signal actually connected here, at all three worker-lifecycle sites, keeping the deleteLater() from r173930. Tested on 7.2.16 with Qt 6.11.2 on X11: stock crashes on the first forced work-area change, patched survives repeated cycles with no new coredumps and no wildcard-disconnect warning. Fixes: #397 Signed-off-by: Christian Cwienk --- .../src/globals/UIDesktopWidgetWatchdog.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/VBox/Frontends/VirtualBox/src/globals/UIDesktopWidgetWatchdog.cpp b/src/VBox/Frontends/VirtualBox/src/globals/UIDesktopWidgetWatchdog.cpp index a6f41f0a279b..3cbfd25ef522 100644 --- a/src/VBox/Frontends/VirtualBox/src/globals/UIDesktopWidgetWatchdog.cpp +++ b/src/VBox/Frontends/VirtualBox/src/globals/UIDesktopWidgetWatchdog.cpp @@ -920,7 +920,10 @@ void UIDesktopWidgetWatchdog::sltHandleHostScreenAvailableGeometryCalculated(int availableGeometry.width(), availableGeometry.height())); /* Forget finished worker: */ - pWorker->disconnect(); + disconnect(static_cast(pWorker), + &UIInvisibleWindow::sigHostScreenAvailableGeometryCalculated, + this, + &UIDesktopWidgetWatchdog::sltHandleHostScreenAvailableGeometryCalculated); pWorker->deleteLater(); m_availableGeometryWorkers[iHostScreenIndex] = 0; @@ -1072,7 +1075,10 @@ void UIDesktopWidgetWatchdog::updateHostScreenAvailableGeometry(int iHostScreenI QWidget *pOldWorker = m_availableGeometryWorkers.value(iHostScreenIndex); if (pOldWorker) { - pOldWorker->disconnect(); + disconnect(static_cast(pOldWorker), + &UIInvisibleWindow::sigHostScreenAvailableGeometryCalculated, + this, + &UIDesktopWidgetWatchdog::sltHandleHostScreenAvailableGeometryCalculated); pOldWorker->deleteLater(); } m_availableGeometryWorkers[iHostScreenIndex] = pWorker; @@ -1102,7 +1108,10 @@ void UIDesktopWidgetWatchdog::cleanupExistingWorkers() { if (pWorker) { - pWorker->disconnect(); + disconnect(static_cast(pWorker), + &UIInvisibleWindow::sigHostScreenAvailableGeometryCalculated, + this, + &UIDesktopWidgetWatchdog::sltHandleHostScreenAvailableGeometryCalculated); pWorker->deleteLater(); } }