From d46135705e104d0ddf119ee6a32bb39d025b4fab Mon Sep 17 00:00:00 2001 From: Daniel Stone Date: Mon, 27 Oct 2025 15:34:35 +0000 Subject: [PATCH] gl-renderer: Fix memory leak for mixed opaque/blended views transform_damage() returns an allocated set of quads; if a surface had both opaque and blended regions, we were overwriting the previously-allocated set of quads for the blended region. Luckily, transform_damage() doesn't need to be called twice anyway, so we can fix this by only calling it once in the first case. Signed-off-by: Daniel Stone --- libweston/renderer-gl/gl-renderer.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/libweston/renderer-gl/gl-renderer.c b/libweston/renderer-gl/gl-renderer.c index 00d72740f..5728a5965 100644 --- a/libweston/renderer-gl/gl-renderer.c +++ b/libweston/renderer-gl/gl-renderer.c @@ -2475,9 +2475,9 @@ draw_paint_node(struct weston_paint_node *pnode, &surface_opaque); gl_log_paint_node_bbox_and_region(gr, "repaint region", &repaint); + transform_damage(pnode, &repaint, &quads, &nquads); if (pixman_region32_not_empty(&surface_opaque)) { - transform_damage(pnode, &repaint, &quads, &nquads); gl_log_paint_node_bbox_and_region(gr, "opaque region", &surface_opaque); repaint_region(gr, pnode, quads, nquads, &surface_opaque, &sconf, true); @@ -2485,15 +2485,13 @@ draw_paint_node(struct weston_paint_node *pnode, } if (pixman_region32_not_empty(&surface_blend)) { - transform_damage(pnode, &repaint, &quads, &nquads); gl_log_paint_node_bbox_and_region(gr, "blended region", &surface_blend); repaint_region(gr, pnode, quads, nquads, &surface_blend, &sconf, false); gs->used_in_output_repaint = true; } - if (quads) - free(quads); + free(quads); pixman_region32_fini(&surface_blend); pixman_region32_fini(&surface_opaque);