cairo/test/leaks.c

63 lines
2.2 KiB
C
Raw Permalink Normal View History

/*
* Copyright © 2023 Uli Schlachter
*
* Permission is hereby granted, free of charge, to any person
* obtaining a copy of this software and associated documentation
* files (the "Software"), to deal in the Software without
* restriction, including without limitation the rights to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies
* of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*
* Author: Uli Schlachter <psychon@znc.in>
*/
#include "cairo-test.h"
Fix font options leak in scaled font A scaled font contains font options. Since commit 67eeed44, this can contain an extra allocation for a custom palette. Since commit edf9497c3a, this contains an extra allocation for a string. Before these commit, font options could just be dropped, but now they need to be freed. This commit makes the relevant code for creating and finishing scaled fonts also clean up the font options. The test added in the previous commit also hits this bug (I only found these leaks accidentially!). Running "valgrind --leak-check=full ./cairo-test-suite -f leaks-set-scaled-font" no longer reports the following after this change: 40 bytes in 1 blocks are definitely lost in loss record 1 of 11 at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105) by 0x48DAFFB: _cairo_scaled_font_init_key (cairo-scaled-font.c:675) by 0x48DC077: cairo_scaled_font_create (cairo-scaled-font.c:1096) by 0x15BF08: leaks_set_scaled_font (leaks.c:43) by 0x129EF0: cairo_test_for_target (cairo-test.c:938) by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545) by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258) by 0x12DEB5: main (cairo-test-runner.c:962) 40 bytes in 1 blocks are definitely lost in loss record 2 of 11 at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105) by 0x49337BB: _cairo_ft_font_face_scaled_font_create (cairo-ft-font.c:2073) by 0x48DC340: cairo_scaled_font_create (cairo-scaled-font.c:1176) by 0x15BF08: leaks_set_scaled_font (leaks.c:43) by 0x129EF0: cairo_test_for_target (cairo-test.c:938) by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545) by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258) by 0x12DEB5: main (cairo-test-runner.c:962) 40 bytes in 1 blocks are definitely lost in loss record 3 of 11 at 0x48407B4: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so) by 0x4886C62: _cairo_font_options_init_copy (cairo-font-options.c:105) by 0x48DB280: _cairo_scaled_font_init (cairo-scaled-font.c:742) by 0x4933804: _cairo_ft_font_face_scaled_font_create (cairo-ft-font.c:2076) by 0x48DC340: cairo_scaled_font_create (cairo-scaled-font.c:1176) by 0x15BF08: leaks_set_scaled_font (leaks.c:43) by 0x129EF0: cairo_test_for_target (cairo-test.c:938) by 0x12B37F: _cairo_test_context_run_for_target (cairo-test.c:1545) by 0x12C385: _cairo_test_runner_draw (cairo-test-runner.c:258) by 0x12DEB5: main (cairo-test-runner.c:962) Signed-off-by: Uli Schlachter <psychon@znc.in>
2023-09-17 09:32:10 +02:00
// Once upon a time, _cairo_gstate_fini(), _cairo_scaled_font_fini_internal(),
// and _cairo_ft_scaled_font_fini() leaked font options.
static cairo_test_status_t
leaks_set_scaled_font (cairo_t *cr, int width, int height)
{
cairo_font_options_t *opt;
cairo_matrix_t matrix;
cairo_scaled_font_t *font;
cairo_matrix_init_identity (&matrix);
opt = cairo_font_options_create ();
cairo_font_options_set_custom_palette_color (opt, 0, 1, 1, 1, 1);
font = cairo_scaled_font_create (cairo_get_font_face (cr), &matrix, &matrix, opt);
cairo_set_scaled_font (cr, font);
cairo_font_options_destroy (opt);
cairo_scaled_font_destroy (font);
// Fill the output so that the same ref image works for everying
cairo_paint (cr);
return CAIRO_TEST_SUCCESS;
}
CAIRO_TEST (leaks_set_scaled_font,
"Regression test for font options memory leak in cairo_set_scaled_font",
"leak", /* keywords */
NULL, /* requirements */
1, 1,
NULL, leaks_set_scaled_font)