mirror of
https://gitlab.freedesktop.org/wayland/weston.git
synced 2026-05-09 02:28:08 +02:00
shared/cairo-util: fix leak from load_cairo_surface()
Fixes ASan reported leaks:
Direct leak of 256 byte(s) in 1 object(s) allocated from:
#0 0x7f8266f2d330 in __interceptor_malloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9330)
#1 0x7f8266c8589a (/lib/x86_64-linux-gnu/libpixman-1.so.0+0x5089a)
#2 0x7f8266c4ea77 (/lib/x86_64-linux-gnu/libpixman-1.so.0+0x19a77)
#3 0x55fa7818f8e8 in load_png ../../git/weston/shared/image-loader.c:297
#4 0x55fa7819039e in load_image ../../git/weston/shared/image-loader.c:423
#5 0x55fa78187b3e in load_cairo_surface ../../git/weston/shared/cairo-util.c:354
#6 0x55fa7815ff8a in background_draw ../../git/weston/clients/desktop-shell.c:779
#7 0x55fa7817b2c2 in widget_redraw ../../git/weston/clients/window.c:4520
#8 0x55fa7817b831 in surface_redraw ../../git/weston/clients/window.c:4578
#9 0x55fa7817b9a7 in idle_redraw ../../git/weston/clients/window.c:4607
#10 0x55fa78184ea4 in display_run ../../git/weston/clients/window.c:6527
#11 0x55fa781646fb in main ../../git/weston/clients/desktop-shell.c:1556
#12 0x7f826659709a in __libc_start_main ../csu/libc-start.c:308
#13 0x55fa7815c0a9 in _start (/home/pq/build/weston-meson/clients/weston-desktop-shell+0x120a9)
Indirect leak of 8024 byte(s) in 1 object(s) allocated from:
#0 0x7f8266f2d330 in __interceptor_malloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9330)
#1 0x55fa7818f5e7 in load_png ../../git/weston/shared/image-loader.c:275
#2 0x55fa7819039e in load_image ../../git/weston/shared/image-loader.c:423
#3 0x55fa78187b3e in load_cairo_surface ../../git/weston/shared/cairo-util.c:354
#4 0x55fa7815ff8a in background_draw ../../git/weston/clients/desktop-shell.c:779
#5 0x55fa7817b2c2 in widget_redraw ../../git/weston/clients/window.c:4520
#6 0x55fa7817b831 in surface_redraw ../../git/weston/clients/window.c:4578
#7 0x55fa7817b9a7 in idle_redraw ../../git/weston/clients/window.c:4607
#8 0x55fa78184ea4 in display_run ../../git/weston/clients/window.c:6527
#9 0x55fa781646fb in main ../../git/weston/clients/desktop-shell.c:1556
#10 0x7f826659709a in __libc_start_main ../csu/libc-start.c:308
#11 0x55fa7815c0a9 in _start (/home/pq/build/weston-meson/clients/weston-desktop-shell+0x120a9)
from the command
ASAN_OPTIONS=fast_unwind_on_malloc=0,malloc_context_size=50 \
LSAN_OPTIONS=suppressions=/home/pq/git/weston/.gitlab-ci/leak-sanitizer.supp \
./tests/test-viewporter test_viewporter_bad_source_rect
by recording the pixman image as user data so it can be freed when the
surface is destroyed.
Signed-off-by: Pekka Paalanen <pekka.paalanen@collabora.com>
This commit is contained in:
parent
928d3a0059
commit
091b1554da
1 changed files with 31 additions and 2 deletions
|
|
@ -344,9 +344,21 @@ rounded_rect(cairo_t *cr, int x0, int y0, int x1, int y1, int radius)
|
|||
cairo_close_path(cr);
|
||||
}
|
||||
|
||||
static void
|
||||
loaded_cairo_surface_destructor(void *data)
|
||||
{
|
||||
pixman_image_t *image = data;
|
||||
|
||||
pixman_image_unref(image);
|
||||
}
|
||||
|
||||
static const cairo_user_data_key_t weston_cairo_util_load_cairo_surface_key;
|
||||
|
||||
cairo_surface_t *
|
||||
load_cairo_surface(const char *filename)
|
||||
{
|
||||
cairo_surface_t *surface;
|
||||
cairo_status_t ret;
|
||||
pixman_image_t *image;
|
||||
int width, height, stride;
|
||||
void *data;
|
||||
|
|
@ -361,8 +373,25 @@ load_cairo_surface(const char *filename)
|
|||
height = pixman_image_get_height(image);
|
||||
stride = pixman_image_get_stride(image);
|
||||
|
||||
return cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32,
|
||||
width, height, stride);
|
||||
surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_ARGB32,
|
||||
width, height, stride);
|
||||
ret = cairo_surface_status(surface);
|
||||
if (ret != CAIRO_STATUS_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
ret = cairo_surface_set_user_data(surface,
|
||||
&weston_cairo_util_load_cairo_surface_key,
|
||||
image,
|
||||
loaded_cairo_surface_destructor);
|
||||
if (ret != CAIRO_STATUS_SUCCESS)
|
||||
goto fail;
|
||||
|
||||
return surface;
|
||||
|
||||
fail:
|
||||
cairo_surface_destroy(surface);
|
||||
pixman_image_unref(image);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue