From: Consolatis <35009135+Consolatis@users.noreply.github.com> Date: Tue, 2 Jul 2024 18:49:53 +0000 (+0200) Subject: ssd/ssd-shadow.c: fix memory leak X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=a466591e0dee4eb9eb2c7d653b56f1bc21606370;p=proto%2Flabwc.git 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. --- 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; }