core: fix a few asan reported issues and a coredump on exit (#6285)

* 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.

* hyprctl: dont leak the fd on destruction

add a destructor and properly free the fd on destruction

* eventloop: add destructor and free event source

properly free the wl_event_source upon destruction.
This commit is contained in:
Tom Englund 2024-06-02 18:42:54 +02:00 committed by Vaxry
parent e08195d240
commit eaecf7db14
6 changed files with 30 additions and 4 deletions

View file

@ -1625,6 +1625,11 @@ CHyprCtl::CHyprCtl() {
startHyprCtlSocket(); startHyprCtlSocket();
} }
CHyprCtl::~CHyprCtl() {
if (m_eventSource)
wl_event_source_remove(m_eventSource);
}
SP<SHyprCtlCommand> CHyprCtl::registerCommand(SHyprCtlCommand cmd) { SP<SHyprCtlCommand> CHyprCtl::registerCommand(SHyprCtlCommand cmd) {
return m_vCommands.emplace_back(makeShared<SHyprCtlCommand>(cmd)); return m_vCommands.emplace_back(makeShared<SHyprCtlCommand>(cmd));
} }
@ -1805,5 +1810,5 @@ void CHyprCtl::startHyprCtlSocket() {
Debug::log(LOG, "Hypr socket started at {}", socketPath); 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);
} }

View file

@ -8,6 +8,7 @@
class CHyprCtl { class CHyprCtl {
public: public:
CHyprCtl(); CHyprCtl();
~CHyprCtl();
std::string makeDynamicCall(const std::string& input); std::string makeDynamicCall(const std::string& input);
SP<SHyprCtlCommand> registerCommand(SHyprCtlCommand cmd); SP<SHyprCtlCommand> registerCommand(SHyprCtlCommand cmd);
@ -25,6 +26,7 @@ class CHyprCtl {
void startHyprCtlSocket(); void startHyprCtlSocket();
std::vector<SP<SHyprCtlCommand>> m_vCommands; std::vector<SP<SHyprCtlCommand>> m_vCommands;
wl_event_source* m_eventSource = nullptr;
}; };
inline std::unique_ptr<CHyprCtl> g_pHyprCtl; inline std::unique_ptr<CHyprCtl> g_pHyprCtl;

View file

@ -13,6 +13,11 @@ CEventLoopManager::CEventLoopManager() {
m_sTimers.timerfd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); 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) { static int timerWrite(int fd, uint32_t mask, void* data) {
g_pEventLoopManager->onTimerFire(); g_pEventLoopManager->onTimerFire();
return 1; return 1;
@ -22,7 +27,7 @@ void CEventLoopManager::enterLoop(wl_display* display, wl_event_loop* wlEventLoo
m_sWayland.loop = wlEventLoop; m_sWayland.loop = wlEventLoop;
m_sWayland.display = display; 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); wl_display_run(display);

View file

@ -10,6 +10,7 @@
class CEventLoopManager { class CEventLoopManager {
public: public:
CEventLoopManager(); CEventLoopManager();
~CEventLoopManager();
void enterLoop(wl_display* display, wl_event_loop* wlEventLoop); void enterLoop(wl_display* display, wl_event_loop* wlEventLoop);
@ -24,8 +25,9 @@ class CEventLoopManager {
private: private:
struct { struct {
wl_event_loop* loop = nullptr; wl_event_loop* loop = nullptr;
wl_display* display = nullptr; wl_display* display = nullptr;
wl_event_source* eventSource = nullptr;
} m_sWayland; } m_sWayland;
struct { struct {

View file

@ -837,6 +837,17 @@ CXWM::CXWM() {
xcb_flush(connection); 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) { 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); xcb_change_property(connection, XCB_PROP_MODE_REPLACE, screen->root, HYPRATOMS["_NET_ACTIVE_WINDOW"], HYPRATOMS["WINDOW"], 32, 1, &window);
} }

View file

@ -60,6 +60,7 @@ struct SXSelection {
class CXWM { class CXWM {
public: public:
CXWM(); CXWM();
~CXWM();
int onEvent(int fd, uint32_t mask); int onEvent(int fd, uint32_t mask);