diff options
| author | vaxerski <vaxry@vaxry.net> | 2025-08-16 16:52:28 +0200 |
|---|---|---|
| committer | vaxerski <vaxry@vaxry.net> | 2025-08-16 16:52:40 +0200 |
| commit | 78c9e2080c800e9da0792b73ca436ef49384bfb7 (patch) | |
| tree | 29fb029e91650aa00e26bd3c6a2f01f20b1d3137 /src/helpers/Monitor.cpp | |
| parent | 1cbb62ed6a3d9232448a89fe569d253794e5f114 (diff) | |
framescheduler: fix edge case crashes
rare UAFs because renderMonitor can call onDisconnect (ugh, that should be changed...)
fixes #11073
Diffstat (limited to 'src/helpers/Monitor.cpp')
| -rw-r--r-- | src/helpers/Monitor.cpp | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/helpers/Monitor.cpp b/src/helpers/Monitor.cpp index 37f650a1..fa0965b8 100644 --- a/src/helpers/Monitor.cpp +++ b/src/helpers/Monitor.cpp @@ -63,7 +63,10 @@ void CMonitor::onConnect(bool noRule) { g_pEventLoopManager->doLater([] { g_pConfigManager->ensurePersistentWorkspacesPresent(); }); - m_listeners.frame = m_output->events.frame.listen([this] { m_frameScheduler->onFrame(); }); + m_listeners.frame = m_output->events.frame.listen([this] { + if (m_frameScheduler) + m_frameScheduler->onFrame(); + }); m_listeners.commit = m_output->events.commit.listen([this] { if (true) { // FIXME: E->state->committed & WLR_OUTPUT_STATE_BUFFER PROTO::screencopy->onOutputCommit(m_self.lock()); @@ -127,7 +130,8 @@ void CMonitor::onConnect(bool noRule) { applyMonitorRule(&rule); }); - m_frameScheduler = makeUnique<CMonitorFrameScheduler>(m_self.lock()); + m_frameScheduler = makeUnique<CMonitorFrameScheduler>(m_self.lock()); + m_frameScheduler->m_self = WP<CMonitorFrameScheduler>(m_frameScheduler); m_tearingState.canTear = m_output->getBackend()->type() == Aquamarine::AQ_BACKEND_DRM; |
