summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEren <51189118+astridlyre@users.noreply.github.com>2026-05-01 15:50:02 -0700
committerGitHub <noreply@github.com>2026-05-01 23:50:02 +0100
commit4ab3a40398d1331b69e033ab14533524c554a002 (patch)
tree2a4f7a75b89a02d55522e1aef9adf71a2cb1940d
parent5f9df52b5593bda5bd60786691f2bac61f3ae89d (diff)
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
-rw-r--r--src/managers/screenshare/ScreenshareManager.cpp16
-rw-r--r--src/managers/screenshare/ScreenshareSession.cpp2
2 files changed, 10 insertions, 8 deletions
diff --git a/src/managers/screenshare/ScreenshareManager.cpp b/src/managers/screenshare/ScreenshareManager.cpp
index 6a0f5b95..6b5c0ade 100644
--- a/src/managers/screenshare/ScreenshareManager.cpp
+++ b/src/managers/screenshare/ScreenshareManager.cpp
@@ -140,16 +140,18 @@ WP<CScreenshareSession> CScreenshareManager::getManagedSession(eScreenshareType
m_sessions.emplace_back(session);
it = m_managedSessions.emplace(m_managedSessions.end(), makeUnique<SManagedSession>(std::move(session)));
- }
- auto& session = *it;
+ auto& managed = *it;
+ managed->stoppedListener = managed->m_session->m_events.stopped.listen([managed = WP<SManagedSession>(managed)]() {
+ if (!managed)
+ return;
- session->stoppedListener = session->m_session->m_events.stopped.listen([session = WP<SManagedSession>(session)]() {
- if (!session.expired())
- std::erase_if(Screenshare::mgr()->m_managedSessions, [&](const auto& s) { return s && s->m_session.get() == session->m_session.get(); });
- });
+ const auto& session = managed->m_session;
+ std::erase_if(Screenshare::mgr()->m_managedSessions, [&session](const auto& s) { return s && s->m_session == session; });
+ });
+ }
- 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 e3676ec0..1f7aeb88 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() {