From 1b0a854d01304c64c6b4365dadf8e18c3bfac9f2 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Fri, 31 May 2024 13:27:11 +0200 Subject: [PATCH 1/3] xwayland: add destructor to CXWM and free resource the wl_event_resource was running upon destruction of the compositor causing a null pointer segfault in onX11Event so ensure the event is removed upon destruction, also free the memory allocated by xcb_errors_context_new and finally call xcb_disconnect on the connection to free the fd and its memory. --- src/xwayland/XWM.cpp | 11 +++++++++++ src/xwayland/XWM.hpp | 1 + 2 files changed, 12 insertions(+) diff --git a/src/xwayland/XWM.cpp b/src/xwayland/XWM.cpp index b0f8d6aa807..5dfd483916d 100644 --- a/src/xwayland/XWM.cpp +++ b/src/xwayland/XWM.cpp @@ -837,6 +837,17 @@ CXWM::CXWM() { xcb_flush(connection); } +CXWM::~CXWM() { + if (errors) + xcb_errors_context_free(errors); + + if (connection) + xcb_disconnect(connection); + + if (eventSource) + wl_event_source_remove(eventSource); +} + void CXWM::setActiveWindow(xcb_window_t window) { xcb_change_property(connection, XCB_PROP_MODE_REPLACE, screen->root, HYPRATOMS["_NET_ACTIVE_WINDOW"], HYPRATOMS["WINDOW"], 32, 1, &window); } diff --git a/src/xwayland/XWM.hpp b/src/xwayland/XWM.hpp index b312f4a9c39..1d695a15c92 100644 --- a/src/xwayland/XWM.hpp +++ b/src/xwayland/XWM.hpp @@ -60,6 +60,7 @@ struct SXSelection { class CXWM { public: CXWM(); + ~CXWM(); int onEvent(int fd, uint32_t mask); From 91d5b264ac4ddd7728be2e3234c6e1187979ee95 Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Fri, 31 May 2024 13:41:34 +0200 Subject: [PATCH 2/3] hyprctl: dont leak the fd on destruction add a destructor and properly free the fd on destruction --- src/debug/HyprCtl.cpp | 7 ++++++- src/debug/HyprCtl.hpp | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp index bbe5019aee3..4563c5a15a3 100644 --- a/src/debug/HyprCtl.cpp +++ b/src/debug/HyprCtl.cpp @@ -1625,6 +1625,11 @@ CHyprCtl::CHyprCtl() { startHyprCtlSocket(); } +CHyprCtl::~CHyprCtl() { + if (m_eventSource) + wl_event_source_remove(m_eventSource); +} + SP CHyprCtl::registerCommand(SHyprCtlCommand cmd) { return m_vCommands.emplace_back(makeShared(cmd)); } @@ -1805,5 +1810,5 @@ void CHyprCtl::startHyprCtlSocket() { Debug::log(LOG, "Hypr socket started at {}", socketPath); - wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, m_iSocketFD, WL_EVENT_READABLE, hyprCtlFDTick, nullptr); + m_eventSource = wl_event_loop_add_fd(g_pCompositor->m_sWLEventLoop, m_iSocketFD, WL_EVENT_READABLE, hyprCtlFDTick, nullptr); } diff --git a/src/debug/HyprCtl.hpp b/src/debug/HyprCtl.hpp index b48ea26a114..21a2c5f85a2 100644 --- a/src/debug/HyprCtl.hpp +++ b/src/debug/HyprCtl.hpp @@ -8,6 +8,7 @@ class CHyprCtl { public: CHyprCtl(); + ~CHyprCtl(); std::string makeDynamicCall(const std::string& input); SP registerCommand(SHyprCtlCommand cmd); @@ -25,6 +26,7 @@ class CHyprCtl { void startHyprCtlSocket(); std::vector> m_vCommands; + wl_event_source* m_eventSource = nullptr; }; inline std::unique_ptr g_pHyprCtl; From 227bacb192901fe2c95b093d4a0ae53ca64207be Mon Sep 17 00:00:00 2001 From: Tom Englund Date: Fri, 31 May 2024 13:56:38 +0200 Subject: [PATCH 3/3] eventloop: add destructor and free event source properly free the wl_event_source upon destruction. --- src/managers/eventLoop/EventLoopManager.cpp | 7 ++++++- src/managers/eventLoop/EventLoopManager.hpp | 6 ++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/managers/eventLoop/EventLoopManager.cpp b/src/managers/eventLoop/EventLoopManager.cpp index 5910e71a23f..1193ffb8953 100644 --- a/src/managers/eventLoop/EventLoopManager.cpp +++ b/src/managers/eventLoop/EventLoopManager.cpp @@ -13,6 +13,11 @@ CEventLoopManager::CEventLoopManager() { m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); } +CEventLoopManager::~CEventLoopManager() { + if (m_sWayland.eventSource) + wl_event_source_remove(m_sWayland.eventSource); +} + static int timerWrite(int fd, uint32_t mask, void* data) { g_pEventLoopManager->onTimerFire(); return 1; @@ -22,7 +27,7 @@ void CEventLoopManager::enterLoop(wl_display* display, wl_event_loop* wlEventLoo m_sWayland.loop = wlEventLoop; m_sWayland.display = display; - wl_event_loop_add_fd(wlEventLoop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); + m_sWayland.eventSource = wl_event_loop_add_fd(wlEventLoop, m_sTimers.timerfd, WL_EVENT_READABLE, timerWrite, nullptr); wl_display_run(display); diff --git a/src/managers/eventLoop/EventLoopManager.hpp b/src/managers/eventLoop/EventLoopManager.hpp index f2ba61a4b6f..7a4fa19e599 100644 --- a/src/managers/eventLoop/EventLoopManager.hpp +++ b/src/managers/eventLoop/EventLoopManager.hpp @@ -10,6 +10,7 @@ class CEventLoopManager { public: CEventLoopManager(); + ~CEventLoopManager(); void enterLoop(wl_display* display, wl_event_loop* wlEventLoop); @@ -24,8 +25,9 @@ class CEventLoopManager { private: struct { - wl_event_loop* loop = nullptr; - wl_display* display = nullptr; + wl_event_loop* loop = nullptr; + wl_display* display = nullptr; + wl_event_source* eventSource = nullptr; } m_sWayland; struct {