core: fix a few ubsan issues reported at exit of hyprland (#6699)

* watchdog: dont detach and cause race condition

instead of detaching and causing a race condition on destruction where
the thread is alive and watchdog has been destroyed, check if its
joinable and join it on destruction.

causes heap use after free on exit of compositor.

* render: add checks for compositor shutting down

avoid member call on null pointer, if the g_pHyprRenderer is destroyed
we can call the member makeEGLCurrent on it, causes undefined behaviour
on destruction of the compositor/hyprrenderer.

found with ubsan.
This commit is contained in:
Tom Englund 2024-06-28 22:24:32 +02:00 committed by GitHub
parent f2dc48d92f
commit ac11771348
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 5 additions and 5 deletions

View file

@ -7,7 +7,9 @@ CWatchdog::~CWatchdog() {
m_bExitThread = true; m_bExitThread = true;
m_bNotified = true; m_bNotified = true;
m_cvWatchdogCondition.notify_all(); m_cvWatchdogCondition.notify_all();
m_pWatchdog.reset();
if (m_pWatchdog && m_pWatchdog->joinable())
m_pWatchdog->join();
} }
CWatchdog::CWatchdog() { CWatchdog::CWatchdog() {
@ -33,8 +35,6 @@ CWatchdog::CWatchdog() {
m_bNotified = false; m_bNotified = false;
} }
}); });
m_pWatchdog->detach();
} }
void CWatchdog::startWatching() { void CWatchdog::startWatching() {

View file

@ -6,7 +6,7 @@
#include <dlfcn.h> #include <dlfcn.h>
CRenderbuffer::~CRenderbuffer() { CRenderbuffer::~CRenderbuffer() {
if (!g_pCompositor) if (!g_pCompositor || g_pCompositor->m_bIsShuttingDown || !g_pHyprRenderer)
return; return;
g_pHyprRenderer->makeEGLCurrent(); g_pHyprRenderer->makeEGLCurrent();

View file

@ -9,7 +9,7 @@ CTexture::CTexture() {
} }
CTexture::~CTexture() { CTexture::~CTexture() {
if (m_bNonOwning) if (m_bNonOwning || !g_pCompositor || g_pCompositor->m_bIsShuttingDown || !g_pHyprRenderer)
return; return;
g_pHyprRenderer->makeEGLCurrent(); g_pHyprRenderer->makeEGLCurrent();