diff options
| author | ssareta <ssareta@protonmail.com> | 2026-03-20 10:04:52 +1300 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-03-19 21:04:52 +0000 |
| commit | b940b0d2c197841b0f648598ee782dbaf9e0a89b (patch) | |
| tree | 60aaae9ae2314b1c20ccb6a0531dfd62a5200507 /src | |
| parent | 3b902a47fe0126c9e0fb7fbe2e47b7c1db6b39cf (diff) | |
screencopy: fix crash in screensharing toplevel with invalid handle (#13781)
Diffstat (limited to 'src')
| -rw-r--r-- | src/managers/screenshare/ScreenshareSession.cpp | 9 | ||||
| -rw-r--r-- | src/protocols/ToplevelExport.cpp | 5 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/managers/screenshare/ScreenshareSession.cpp b/src/managers/screenshare/ScreenshareSession.cpp index 5557746c..8dbfc72a 100644 --- a/src/managers/screenshare/ScreenshareSession.cpp +++ b/src/managers/screenshare/ScreenshareSession.cpp @@ -9,10 +9,16 @@ using namespace Screenshare; CScreenshareSession::CScreenshareSession(PHLMONITOR monitor, wl_client* client) : m_type(SHARE_MONITOR), m_monitor(monitor), m_client(client) { + if UNLIKELY (!m_monitor) + return; + init(); } CScreenshareSession::CScreenshareSession(PHLWINDOW window, wl_client* client) : m_type(SHARE_WINDOW), m_window(window), m_client(client) { + if UNLIKELY (!m_window) + return; + m_listeners.windowDestroyed = m_window->m_events.unmap.listen([this]() { stop(); }); m_listeners.windowSizeChanged = m_window->m_events.resize.listen([this]() { calculateConstraints(); @@ -34,6 +40,9 @@ CScreenshareSession::CScreenshareSession(PHLWINDOW window, wl_client* client) : CScreenshareSession::CScreenshareSession(PHLMONITOR monitor, CBox captureRegion, wl_client* client) : m_type(SHARE_REGION), m_monitor(monitor), m_captureBox(captureRegion), m_client(client) { + if UNLIKELY (!m_monitor) + return; + init(); } diff --git a/src/protocols/ToplevelExport.cpp b/src/protocols/ToplevelExport.cpp index d7ba7519..7b3d0c89 100644 --- a/src/protocols/ToplevelExport.cpp +++ b/src/protocols/ToplevelExport.cpp @@ -26,6 +26,11 @@ CToplevelExportClient::CToplevelExportClient(SP<CHyprlandToplevelExportManagerV1 } void CToplevelExportClient::captureToplevel(uint32_t frame, int32_t overlayCursor_, PHLWINDOW handle) { + if UNLIKELY (!handle) { + LOGM(Log::ERR, "Couldn't capture (window doesn't exist)"); + return; + } + auto session = Screenshare::mgr()->getManagedSession(m_resource->client(), handle); // create a frame |
