From ee1c1778bf281150d309bd518ae92a5f6bc75239 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Tue, 15 Jun 2021 16:49:02 +0300 Subject: [PATCH] tests: fix leak in surface_commit_color() in pointer-shot Found by ASan, several leaks like: Direct leak of 48 byte(s) in 2 object(s) allocated from: #0 0x7f35fdc9c518 in calloc (/lib/x86_64-linux-gnu/libasan.so.5+0xe9518) #1 0x55a77d6a4c6a in zalloc ../../git/weston/include/libweston/zalloc.h:38 #2 0x55a77d6a748e in create_shm_buffer ../../git/weston/tests/weston-test-client-helper.c:459 #3 0x55a77d6a78cd in create_shm_buffer_a8r8g8b8 ../../git/weston/tests/weston-test-client-helper.c:499 #4 0x55a77d6a4145 in surface_commit_color ../../git/weston/tests/pointer-shot-test.c:89 #5 0x55a77d6a4542 in pointer_cursor_retains_committed_buffer_after_reenter ../../git/weston/tests/pointer-shot-test.c:135 #6 0x55a77d6a4207 in wrappointer_cursor_retains_committed_buffer_after_reenter ../../git/weston/tests/pointer-shot-test.c:98 #7 0x55a77d6b15c2 in run_test ../../git/weston/tests/weston-test-runner.c:162 #8 0x55a77d6b1c63 in run_case ../../git/weston/tests/weston-test-runner.c:277 #9 0x55a77d6b1a09 in for_each_test_case ../../git/weston/tests/weston-test-runner.c:235 #10 0x55a77d6b1eeb in testsuite_run ../../git/weston/tests/weston-test-runner.c:311 #11 0x7f35f9510b6b in client_thread_routine ../../git/weston/tests/weston-test.c:479 #12 0x7f35fd7a4fa2 in start_thread /build/glibc-vjB4T1/glibc-2.28/nptl/pthread_create.c:486 #13 0x7f35fd8c64ce in clone (/lib/x86_64-linux-gnu/libc.so.6+0xf94ce) Now this test has no more leaks. Signed-off-by: Pekka Paalanen --- tests/pointer-shot-test.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/pointer-shot-test.c b/tests/pointer-shot-test.c index 315d4fa4..606eda3b 100644 --- a/tests/pointer-shot-test.c +++ b/tests/pointer-shot-test.c @@ -81,16 +81,19 @@ send_motion(struct client *client, const struct timespec *time, int x, int y) } static struct buffer * -surface_commit_color(struct client *client, struct wl_surface *surface, +surface_commit_color(struct client *client, struct surface *surface, pixman_color_t *color, int width, int height) { struct buffer *buf; buf = create_shm_buffer_a8r8g8b8(client, width, height); fill_image_with_color(buf->image, color); - wl_surface_attach(surface, buf->proxy, 0, 0); - wl_surface_damage(surface, 0, 0, width, height); - wl_surface_commit(surface); + wl_surface_attach(surface->wl_surface, buf->proxy, 0, 0); + wl_surface_damage(surface->wl_surface, 0, 0, width, height); + wl_surface_commit(surface->wl_surface); + + assert(!surface->buffer); + surface->buffer = buf; return buf; } @@ -125,14 +128,14 @@ TEST(pointer_cursor_retains_committed_buffer_after_reenter) back_cursor_surface = create_test_surface(client); /* Commit buffers for cursors. */ - surface_commit_color(client, main_cursor_surface->wl_surface, &green, 25, 25); - surface_commit_color(client, back_cursor_surface->wl_surface, &magenta, 25, 25); + surface_commit_color(client, main_cursor_surface, &green, 25, 25); + surface_commit_color(client, back_cursor_surface, &magenta, 25, 25); /* We need our own background surface so that we are able to change the cursor * when the pointer leaves the main surface. */ weston_test_move_surface(client->test->weston_test, back_surface->wl_surface, 0, 0); - surface_commit_color(client, back_surface->wl_surface, &gray, 320, 240); + surface_commit_color(client, back_surface, &gray, 320, 240); /* Set up the main surface. */ client->surface = main_surface;