From 9ea76428b68fad5a68e9153bcb246547ac2e5d6c Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Wed, 26 Mar 2025 18:22:44 +0100 Subject: [PATCH] internal: fix minor ubsan errors (#9743) * opengl: check if g_pHyprOpengl exist on compositor destruction we can hit a race where a CEGLSync destructs and tries to call eglDestroySyncKHR on a null g_pHyprOpengl. /src/render/OpenGL.cpp:3019:32: runtime error: member access within null pointer of type 'struct CHyprOpenGLImpl' #0 0x555565eed979 in CEGLSync::~CEGLSync() /src/render/OpenGL.cpp:3019 #1 0x555565f6271e in std::default_delete::operator()(CEGLSync*) const /usr/lib/gcc/x86_64-pc-linux-gnu/14/include/g++-v14/bits/unique_ptr.h:93 * xdgshell: dont apply state on empty states setsize can be called before a state has been added to pending, resulting in calling ApplyState with a empty state. /src/protocols/XDGShell.cpp:323:11: runtime error: null pointer passed as argument 2, which is declared to never be null #0 0x5555659bf67e in CXDGToplevelResource::applyState() /src/protocols/XDGShell.cpp:323 #1 0x5555659bcedc in CXDGToplevelResource::setSize(Hyprutils::Math::Vector2D const&) /src/protocols/XDGShell.cpp: 256 #2 0x555563eed0ef in Events::listener_commitWindow(void*, void*) /src/events/Windows.cpp:841 --- src/protocols/XDGShell.cpp | 7 +++++-- src/render/OpenGL.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/protocols/XDGShell.cpp b/src/protocols/XDGShell.cpp index db274e3c..4170d4dd 100644 --- a/src/protocols/XDGShell.cpp +++ b/src/protocols/XDGShell.cpp @@ -319,8 +319,11 @@ uint32_t CXDGToplevelResource::setSuspeneded(bool sus) { void CXDGToplevelResource::applyState() { wl_array arr; wl_array_init(&arr); - wl_array_add(&arr, pendingApply.states.size() * sizeof(int)); - memcpy(arr.data, pendingApply.states.data(), pendingApply.states.size() * sizeof(int)); + + if (!pendingApply.states.empty()) { + wl_array_add(&arr, pendingApply.states.size() * sizeof(int)); + memcpy(arr.data, pendingApply.states.data(), pendingApply.states.size() * sizeof(int)); + } resource->sendConfigure(pendingApply.size.x, pendingApply.size.y, &arr); diff --git a/src/render/OpenGL.cpp b/src/render/OpenGL.cpp index 2a96f1b7..675955ee 100644 --- a/src/render/OpenGL.cpp +++ b/src/render/OpenGL.cpp @@ -3021,7 +3021,7 @@ CEGLSync::~CEGLSync() { if (sync == EGL_NO_SYNC_KHR) return; - if (g_pHyprOpenGL->m_sProc.eglDestroySyncKHR(g_pHyprOpenGL->m_pEglDisplay, sync) != EGL_TRUE) + if (g_pHyprOpenGL && g_pHyprOpenGL->m_sProc.eglDestroySyncKHR(g_pHyprOpenGL->m_pEglDisplay, sync) != EGL_TRUE) Debug::log(ERR, "eglDestroySyncKHR failed"); }