diff options
author | Tom Englund <[email protected]> | 2024-05-03 15:42:08 +0200 |
---|---|---|
committer | GitHub <[email protected]> | 2024-05-03 14:42:08 +0100 |
commit | d5bf15387ad3b4ee36cae7a3cd9f4a9c28790f2e (patch) | |
tree | d5c82bfa5c3c1aa2d35cdbb1ad67b3c37d17cbbb | |
parent | 387127b12ab5df8f8f40e8da7d76f47636562cab (diff) | |
download | Hyprland-d5bf15387ad3b4ee36cae7a3cd9f4a9c28790f2e.tar.gz Hyprland-d5bf15387ad3b4ee36cae7a3cd9f4a9c28790f2e.zip |
internal: fix a few asan reported leaks on exit of hyprland (#5852)
* notifications: free cairo images on destruction
asan reports a leak on exit if we dont free the image we created in the
draw function. add a destructor and free images on exit.
* compositor: destroy wlroots types on exit
there are a few types not being destroyed on exit and causing a leak on
exit in wlroots reported by asan, add those.
* cursormgr: ensure we destroy cursor mgr on exit
add a destructor and call wlr_xcursor_manager_destroy on the manager on
destruction, leak reported by asan.
* keybindmgr: free state and keymap
add missing keymap_unref on creation, and add a destructor and free the
state on exit. leak reported by asan.
* skeyboard: add destructor and free state
free the state on destruction of keyboard, reported as leak by asan
-rw-r--r-- | src/Compositor.cpp | 16 | ||||
-rw-r--r-- | src/debug/HyprNotificationOverlay.cpp | 7 | ||||
-rw-r--r-- | src/debug/HyprNotificationOverlay.hpp | 1 | ||||
-rw-r--r-- | src/helpers/WLClasses.hpp | 5 | ||||
-rw-r--r-- | src/managers/CursorManager.cpp | 5 | ||||
-rw-r--r-- | src/managers/CursorManager.hpp | 1 | ||||
-rw-r--r-- | src/managers/KeybindManager.cpp | 6 | ||||
-rw-r--r-- | src/managers/KeybindManager.hpp | 1 |
8 files changed, 41 insertions, 1 deletions
diff --git a/src/Compositor.cpp b/src/Compositor.cpp index 3f53f6c3..ea88bec1 100644 --- a/src/Compositor.cpp +++ b/src/Compositor.cpp @@ -421,8 +421,22 @@ void CCompositor::cleanup() { g_pWatchdog.reset(); g_pXWaylandManager.reset(); - wl_display_terminate(m_sWLDisplay); + if (m_sWLRCursor) + wlr_cursor_destroy(m_sWLRCursor); + + if (m_sSeat.seat) + wlr_seat_destroy(m_sSeat.seat); + + if (m_sWLRRenderer) + wlr_renderer_destroy(m_sWLRRenderer); + + if (m_sWLRAllocator) + wlr_allocator_destroy(m_sWLRAllocator); + if (m_sWLRBackend) + wlr_backend_destroy(m_sWLRBackend); + + wl_display_terminate(m_sWLDisplay); m_sWLDisplay = nullptr; } diff --git a/src/debug/HyprNotificationOverlay.cpp b/src/debug/HyprNotificationOverlay.cpp index 2f00d978..80c80601 100644 --- a/src/debug/HyprNotificationOverlay.cpp +++ b/src/debug/HyprNotificationOverlay.cpp @@ -36,6 +36,13 @@ CHyprNotificationOverlay::CHyprNotificationOverlay() { m_szIconFontName = fonts.substr(COLON + 2, LASTCHAR - (COLON + 2)); } +CHyprNotificationOverlay::~CHyprNotificationOverlay() { + if (m_pCairo) + cairo_destroy(m_pCairo); + if (m_pCairoSurface) + cairo_surface_destroy(m_pCairoSurface); +} + void CHyprNotificationOverlay::addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon, const float fontSize) { const auto PNOTIF = m_dNotifications.emplace_back(std::make_unique<SNotification>()).get(); diff --git a/src/debug/HyprNotificationOverlay.hpp b/src/debug/HyprNotificationOverlay.hpp index 25934734..d086ada9 100644 --- a/src/debug/HyprNotificationOverlay.hpp +++ b/src/debug/HyprNotificationOverlay.hpp @@ -39,6 +39,7 @@ struct SNotification { class CHyprNotificationOverlay { public: CHyprNotificationOverlay(); + ~CHyprNotificationOverlay(); void draw(CMonitor* pMonitor); void addNotification(const std::string& text, const CColor& color, const float timeMs, const eIcons icon = ICON_NONE, const float fontSize = 13.f); diff --git a/src/helpers/WLClasses.hpp b/src/helpers/WLClasses.hpp index 7eaebead..c625aae0 100644 --- a/src/helpers/WLClasses.hpp +++ b/src/helpers/WLClasses.hpp @@ -102,6 +102,11 @@ struct SKeyboard { bool operator==(const SKeyboard& rhs) const { return keyboard == rhs.keyboard; } + + ~SKeyboard() { + if (xkbTranslationState) + xkb_state_unref(xkbTranslationState); + } }; struct SMouse { diff --git a/src/managers/CursorManager.cpp b/src/managers/CursorManager.cpp index fa5ee8cd..3fcecfe4 100644 --- a/src/managers/CursorManager.cpp +++ b/src/managers/CursorManager.cpp @@ -53,6 +53,11 @@ CCursorManager::CCursorManager() { static auto P = g_pHookSystem->hookDynamic("monitorLayoutChanged", [this](void* self, SCallbackInfo& info, std::any param) { this->updateTheme(); }); } +CCursorManager::~CCursorManager() { + if (m_pWLRXCursorMgr) + wlr_xcursor_manager_destroy(m_pWLRXCursorMgr); +} + void CCursorManager::dropBufferRef(CCursorManager::CCursorBuffer* ref) { std::erase_if(m_vCursorBuffers, [ref](const auto& buf) { return buf.get() == ref; }); } diff --git a/src/managers/CursorManager.hpp b/src/managers/CursorManager.hpp index ff633592..629f29e1 100644 --- a/src/managers/CursorManager.hpp +++ b/src/managers/CursorManager.hpp @@ -13,6 +13,7 @@ struct wlr_xwayland; class CCursorManager { public: CCursorManager(); + ~CCursorManager(); wlr_buffer* getCursorBuffer(); diff --git a/src/managers/KeybindManager.cpp b/src/managers/KeybindManager.cpp index 1150ac2e..cfad932a 100644 --- a/src/managers/KeybindManager.cpp +++ b/src/managers/KeybindManager.cpp @@ -116,6 +116,11 @@ CKeybindManager::CKeybindManager() { }); } +CKeybindManager::~CKeybindManager() { + if (m_pXKBTranslationState) + xkb_state_unref(m_pXKBTranslationState); +} + void CKeybindManager::addKeybind(SKeybind kb) { m_lKeybinds.push_back(kb); @@ -219,6 +224,7 @@ void CKeybindManager::updateXKBTranslationState() { xkb_context_unref(PCONTEXT); m_pXKBTranslationState = xkb_state_new(PKEYMAP); + xkb_keymap_unref(PKEYMAP); } bool CKeybindManager::ensureMouseBindState() { diff --git a/src/managers/KeybindManager.hpp b/src/managers/KeybindManager.hpp index deb25ae9..24e71c6a 100644 --- a/src/managers/KeybindManager.hpp +++ b/src/managers/KeybindManager.hpp @@ -58,6 +58,7 @@ struct SParsedKey { class CKeybindManager { public: CKeybindManager(); + ~CKeybindManager(); bool onKeyEvent(wlr_keyboard_key_event*, SKeyboard*); bool onAxisEvent(wlr_pointer_axis_event*); |