From d0d3382131c4a52db263ec41b9816aff80e16f0a Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Sat, 1 Mar 2025 20:50:30 -0600 Subject: [PATCH 1/2] backend: Fix Wayland backend idleCallbacks destruction --- src/backend/Wayland.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/backend/Wayland.cpp b/src/backend/Wayland.cpp index f7648cc..9b7232d 100644 --- a/src/backend/Wayland.cpp +++ b/src/backend/Wayland.cpp @@ -508,7 +508,6 @@ Aquamarine::CWaylandOutput::CWaylandOutput(const std::string& name_, Hyprutils:: } Aquamarine::CWaylandOutput::~CWaylandOutput() { - backend->idleCallbacks.clear(); // FIXME: mega hack to avoid a UAF in frame events events.destroy.emit(); if (waylandState.xdgToplevel) waylandState.xdgToplevel->sendDestroy(); @@ -769,8 +768,13 @@ void Aquamarine::CWaylandOutput::scheduleFrame(const scheduleFrameReason reason) if (waylandState.frameCallback) frameScheduledWhileWaiting = true; - else - backend->idleCallbacks.emplace_back([this]() { sendFrameAndSetCallback(); }); + else { + auto w = self; + backend->idleCallbacks.emplace_back([w]() { + if (auto o = w.lock()) + o->sendFrameAndSetCallback(); + }); + } } Aquamarine::CWaylandBuffer::CWaylandBuffer(SP buffer_, Hyprutils::Memory::CWeakPointer backend_) : buffer(buffer_), backend(backend_) { From 78f65da80413f29d94a7a51c45b0278ea27a329e Mon Sep 17 00:00:00 2001 From: Lee Bousfield Date: Thu, 6 Mar 2025 11:05:40 -0600 Subject: [PATCH 2/2] backend: Use closure reassignment syntax --- src/backend/Wayland.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/backend/Wayland.cpp b/src/backend/Wayland.cpp index 9b7232d..1a812fe 100644 --- a/src/backend/Wayland.cpp +++ b/src/backend/Wayland.cpp @@ -769,8 +769,7 @@ void Aquamarine::CWaylandOutput::scheduleFrame(const scheduleFrameReason reason) if (waylandState.frameCallback) frameScheduledWhileWaiting = true; else { - auto w = self; - backend->idleCallbacks.emplace_back([w]() { + backend->idleCallbacks.emplace_back([w = self]() { if (auto o = w.lock()) o->sendFrameAndSetCallback(); });