From 1f783b71a393ceac7b7d2f1aa194848c736a846b Mon Sep 17 00:00:00 2001 From: dvh Date: Wed, 11 Nov 2026 10:06:47 +0100 Subject: [PATCH] fix a buffer leak in outputmgrapplyortest() wlr_swapchain_acquire() returns a locked buffer and wlr_output_state_set_buffer() takes its own lock, so every output enabled through output management (wlr-randr, kanshi) leaked a buffer. Unlock it once the state holds it, as wlr_output_swapchain_manager does. --- dwl.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dwl.c b/dwl.c index ca05f99..6662022 100644 --- a/dwl.c +++ b/dwl.c @@ -2284,8 +2284,12 @@ outputmgrapplyortest(struct wlr_output_configuration_v1 *config, int test) for (i = 0; i < states_len; i++) { struct wlr_swapchain *swapchain = wlr_output_swapchain_manager_get_swapchain( &swapchain_manager, states[i].output); - if (swapchain && !states[i].output->enabled) - wlr_output_state_set_buffer(&states[i].base, wlr_swapchain_acquire(swapchain)); + struct wlr_buffer *buffer; + if (swapchain && !states[i].output->enabled + && (buffer = wlr_swapchain_acquire(swapchain))) { + wlr_output_state_set_buffer(&states[i].base, buffer); + wlr_buffer_unlock(buffer); + } } if (!(ok = wlr_backend_commit(backend, states, states_len)))