mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-26 08:25:59 +01:00
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:
parent
e08195d240
commit
eaecf7db14
6 changed files with 30 additions and 4 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue