From 5ecd8393a22f9162c2ff00bd1b9cbd0b17b43ea3 Mon Sep 17 00:00:00 2001 From: neonetizen Date: Thu, 21 May 2026 12:30:39 -0700 Subject: [PATCH] internal: fix null deref in setWindowFullscreenInternal when fullscreen state stale (#14725) --- src/Compositor.cpp | 2 ++ src/desktop/view/Window.cpp | 4 ++++ src/managers/screenshare/ScreenshareFrame.cpp | 7 +++++-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Compositor.cpp b/src/Compositor.cpp index d2fe2f9c8..54c60b212 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -2196,6 +2196,8 @@ void CCompositor::changeWindowFullscreenModeClient(const PHLWINDOW PWINDOW, cons // TODO: move fs functions to Desktop:: void CCompositor::setWindowFullscreenInternal(const PHLWINDOW PWINDOW, const eFullscreenMode MODE) { + if (!PWINDOW) + return; if (PWINDOW->m_ruleApplicator->syncFullscreen().valueOrDefault()) setWindowFullscreenState(PWINDOW, Desktop::View::SFullscreenState{.internal = MODE, .client = MODE}); else diff --git a/src/desktop/view/Window.cpp b/src/desktop/view/Window.cpp index eb7e171ec..635da1e08 100644 --- a/src/desktop/view/Window.cpp +++ b/src/desktop/view/Window.cpp @@ -1820,6 +1820,10 @@ void CWindow::mapWindow() { Desktop::focusState()->rawMonitorFocus(g_pCompositor->getMonitorFromVector({})); PMONITOR = Desktop::focusState()->monitor(); } + if (!PMONITOR || (!PMONITOR->m_activeSpecialWorkspace && !PMONITOR->m_activeWorkspace)) { + Log::logger->log(Log::ERR, "mapWindow: no valid monitor/workspace, aborting map for {:x}", (uintptr_t)this); + return; + } auto PWORKSPACE = PMONITOR->m_activeSpecialWorkspace ? PMONITOR->m_activeSpecialWorkspace : PMONITOR->m_activeWorkspace; m_monitor = PMONITOR; m_workspace = PWORKSPACE; diff --git a/src/managers/screenshare/ScreenshareFrame.cpp b/src/managers/screenshare/ScreenshareFrame.cpp index 4cc51335e..69d4ba65a 100644 --- a/src/managers/screenshare/ScreenshareFrame.cpp +++ b/src/managers/screenshare/ScreenshareFrame.cpp @@ -29,8 +29,11 @@ CScreenshareFrame::~CScreenshareFrame() { if (m_failed || !m_shared) return; - if (!m_copied && m_callback) - m_callback(RESULT_NOT_COPIED); + if (!m_copied && m_callback) { + FScreenshareCallback cb; + std::swap(cb, m_callback); + cb(RESULT_NOT_COPIED); + } } bool CScreenshareFrame::done() const {