From e3eaccb939836386aa5f5895eea0da3e9863826c Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Sat, 5 Dec 2020 07:46:41 +0100 Subject: [PATCH 1/2] boilerplate-xcb: Avoid leaks on error Before this commit, running the test suite against a non-existing display under valgrind resulted in: $ ( cd test; DISPLAY=:2 CAIRO_TEST_TARGET=xcb valgrind --leak-check=full .libs/cairo-test-suite -f random-clip ) [...] ==47359== 64 bytes in 2 blocks are definitely lost in loss record 1 of 7 ==47359== at 0x483AB65: calloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) ==47359== by 0x18A272: cairo_boilerplate_xcalloc (cairo-boilerplate-system.c:65) ==47359== by 0x18D652: _cairo_boilerplate_xcb_create_surface (cairo-boilerplate-xcb.c:269) ==47359== by 0x12906F: cairo_test_for_target (cairo-test.c:819) ==47359== by 0x12AAB5: _cairo_test_context_run_for_target (cairo-test.c:1555) ==47359== by 0x126921: _cairo_test_runner_draw (cairo-test-runner.c:250) ==47359== by 0x126921: main (cairo-test-runner.c:932) This commit fixes that by freeing the allocated memory in the error path. Signed-off-by: Uli Schlachter --- boilerplate/cairo-boilerplate-xcb.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/boilerplate/cairo-boilerplate-xcb.c b/boilerplate/cairo-boilerplate-xcb.c index cc9b422e9..e301d1299 100644 --- a/boilerplate/cairo-boilerplate-xcb.c +++ b/boilerplate/cairo-boilerplate-xcb.c @@ -276,6 +276,7 @@ _cairo_boilerplate_xcb_create_surface (const char *name, xtc->c = c = xcb_connect(NULL,NULL); if (c == NULL || xcb_connection_has_error(c)) { free (xtc); + free (info); return NULL; } @@ -309,12 +310,17 @@ _cairo_boilerplate_xcb_create_surface (const char *name, if (xcb_request_check (c, cookie) != NULL) { xcb_disconnect (c); free (xtc); + free (info); return NULL; } info->formats = xcb_render_query_pict_formats_reply (c, formats_cookie, 0); - if (info->formats == NULL) + if (info->formats == NULL) { + xcb_disconnect (c); + free (xtc); + free (info); return NULL; + } for (i = xcb_render_query_pict_formats_formats_iterator (info->formats); i.rem; From 2ceb279d704840dacf6880b5bf2e168ede16097a Mon Sep 17 00:00:00 2001 From: Uli Schlachter Date: Sat, 5 Dec 2020 08:08:14 +0100 Subject: [PATCH 2/2] boilerplate-xcb: Avoid leaks on success This gets rid of the following two leaks reported by valgrind when successfully running a test with CAIRO_TEST_TARGET=xcb: 8,000 bytes in 2 blocks are definitely lost in loss record 9 of 10 at 0x483877F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4B7E135: read_packet (xcb_in.c:259) by 0x4B7E135: _xcb_in_read (xcb_in.c:1031) by 0x4B7BF8E: _xcb_conn_wait (xcb_conn.c:516) by 0x4B7D6AE: wait_for_reply (xcb_in.c:516) by 0x4B7D8C8: xcb_request_check (xcb_in.c:745) by 0x18D747: _cairo_boilerplate_xcb_create_surface (cairo-boilerplate-xcb.c:310) by 0x12906F: cairo_test_for_target (cairo-test.c:819) by 0x12AAB5: _cairo_test_context_run_for_target (cairo-test.c:1555) by 0x126921: _cairo_test_runner_draw (cairo-test-runner.c:250) by 0x126921: main (cairo-test-runner.c:932) 8,000 bytes in 2 blocks are definitely lost in loss record 10 of 10 at 0x483877F: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4B7E135: read_packet (xcb_in.c:259) by 0x4B7E135: _xcb_in_read (xcb_in.c:1031) by 0x4B7BF8E: _xcb_conn_wait (xcb_conn.c:516) by 0x4B7D6AE: wait_for_reply (xcb_in.c:516) by 0x4B7D7C0: xcb_wait_for_reply (xcb_in.c:546) by 0x18D45D: find_depth (cairo-boilerplate-xcb.c:154) by 0x18D45D: _cairo_boilerplate_xcb_create_render_0_0 (cairo-boilerplate-xcb.c:621) by 0x12906F: cairo_test_for_target (cairo-test.c:819) by 0x12AAB5: _cairo_test_context_run_for_target (cairo-test.c:1555) by 0x126921: _cairo_test_runner_draw (cairo-test-runner.c:250) by 0x126921: main (cairo-test-runner.c:932) Signed-off-by: Uli Schlachter --- boilerplate/cairo-boilerplate-xcb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/boilerplate/cairo-boilerplate-xcb.c b/boilerplate/cairo-boilerplate-xcb.c index e301d1299..98b39ec58 100644 --- a/boilerplate/cairo-boilerplate-xcb.c +++ b/boilerplate/cairo-boilerplate-xcb.c @@ -174,6 +174,7 @@ find_depth (xcb_connection_t *connection, } static const cairo_user_data_key_t key; +static const cairo_user_data_key_t key2; struct similar { xcb_connection_t *connection; @@ -365,6 +366,7 @@ _cairo_boilerplate_xcb_create_surface (const char *name, render_format, width, height); cairo_device_set_user_data (cairo_surface_get_device (surface), &key, info, free); + cairo_device_set_user_data (cairo_surface_get_device (surface), &key2, info->formats, free); if (mode != CAIRO_BOILERPLATE_MODE_PERF) _cairo_boilerplate_xcb_setup_test_surface(surface); @@ -629,8 +631,8 @@ _cairo_boilerplate_xcb_create_render_0_0 (const char *name, xtc->drawable, render_format, width, height); + free (formats); if (cairo_surface_status (surface)) { - free (formats); xcb_disconnect (c); free (xtc); return surface;