From 4ab3a40398d1331b69e033ab14533524c554a002 Mon Sep 17 00:00:00 2001 From: Eren <51189118+astridlyre@users.noreply.github.com> Date: Fri, 1 May 2026 15:50:02 -0700 Subject: [PATCH] screenshare: adjust session cleanup and event emission order (#14229) * fix(screenshare): adjust session cleanup and event emission order Revised the handling of `stoppedListener` initialization in `getManagedSession` to ensure correct scoping and lifecycle management. Updated the `stop` method in `CScreenshareSession` to adjust the order of `screenshareEvents` and `stopped.emit()` to prevent potential use-after-free scenarios. * fix(screenshare): ensure managedSession removal uses consistent target reference This change updates the lambda in the stopped listener to use a pre-fetched target pointer for comparison when erasing sessions. * fix(screenshare): use early-return and smart ptr comparison in session cleanup --- .../screenshare/ScreenshareManager.cpp | 18 ++++++++++-------- .../screenshare/ScreenshareSession.cpp | 2 +- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/managers/screenshare/ScreenshareManager.cpp b/src/managers/screenshare/ScreenshareManager.cpp index 6a0f5b958..6b5c0aded 100644 --- a/src/managers/screenshare/ScreenshareManager.cpp +++ b/src/managers/screenshare/ScreenshareManager.cpp @@ -140,16 +140,18 @@ WP CScreenshareManager::getManagedSession(eScreenshareType m_sessions.emplace_back(session); it = m_managedSessions.emplace(m_managedSessions.end(), makeUnique(std::move(session))); + + auto& managed = *it; + managed->stoppedListener = managed->m_session->m_events.stopped.listen([managed = WP(managed)]() { + if (!managed) + return; + + const auto& session = managed->m_session; + std::erase_if(Screenshare::mgr()->m_managedSessions, [&session](const auto& s) { return s && s->m_session == session; }); + }); } - auto& session = *it; - - session->stoppedListener = session->m_session->m_events.stopped.listen([session = WP(session)]() { - if (!session.expired()) - std::erase_if(Screenshare::mgr()->m_managedSessions, [&](const auto& s) { return s && s->m_session.get() == session->m_session.get(); }); - }); - - return session->m_session; + return (*it)->m_session; } bool CScreenshareManager::isOutputBeingSSd(PHLMONITOR monitor) { diff --git a/src/managers/screenshare/ScreenshareSession.cpp b/src/managers/screenshare/ScreenshareSession.cpp index e3676ec0b..1f7aeb881 100644 --- a/src/managers/screenshare/ScreenshareSession.cpp +++ b/src/managers/screenshare/ScreenshareSession.cpp @@ -56,9 +56,9 @@ void CScreenshareSession::stop() { if (m_stopped) return; m_stopped = true; - m_events.stopped.emit(); screenshareEvents(false); + m_events.stopped.emit(); } bool CScreenshareSession::isActive() {