From a466591e0dee4eb9eb2c7d653b56f1bc21606370 Mon Sep 17 00:00:00 2001 From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Tue, 2 Jul 2024 20:49:53 +0200 Subject: [PATCH] ssd/ssd-shadow.c: fix memory leak Before this patch, we were leaking memory [0] because the shadow implementation did not free the ssd_parts on destruction. There was also no check if shadows were actually enabled via rc.xml or not so this also impacted people who were not using shadows but were not setting the shadow size via their theme to 0. [0] 44 bytes per ssd_part * 8 parts * 2 states == 704 bytes per view closed. Note that Reconfigure also re-creates the SSD, thus we were also leaking 704 bytes * nr_views per Reconfigure. --- src/ssd/ssd-shadow.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ssd/ssd-shadow.c b/src/ssd/ssd-shadow.c index cf54f6fa..3e6227aa 100644 --- a/src/ssd/ssd-shadow.c +++ b/src/ssd/ssd-shadow.c @@ -241,7 +241,12 @@ ssd_shadow_create(struct ssd *ssd) struct wlr_scene_tree *parent; FOR_EACH_STATE(ssd, subtree) { - if (subtree == &ssd->shadow.active) { + wl_list_init(&subtree->parts); + + if (!rc.shadows_enabled) { + /* Shadows are globally disabled */ + continue; + } else if (subtree == &ssd->shadow.active) { if (theme->window_active_shadow_size == 0) { /* Active window shadows are disabled */ continue; @@ -264,7 +269,6 @@ ssd_shadow_create(struct ssd *ssd) corner_bottom_buffer = &theme->shadow_corner_bottom_inactive->base; edge_buffer = &theme->shadow_edge_inactive->base; } - wl_list_init(&subtree->parts); make_shadow(&subtree->parts, LAB_SSD_PART_CORNER_BOTTOM_RIGHT, parent, @@ -311,6 +315,16 @@ ssd_shadow_destroy(struct ssd *ssd) assert(ssd); assert(ssd->shadow.tree); + struct ssd_sub_tree *subtree; + FOR_EACH_STATE(ssd, subtree) { + ssd_destroy_parts(&subtree->parts); + /* + * subtree->tree will be destroyed when its + * parent (ssd->shadow.tree) is destroyed. + */ + subtree->tree = NULL; + } FOR_EACH_END + wlr_scene_node_destroy(&ssd->shadow.tree->node); ssd->shadow.tree = NULL; }