[cairo-commit] 2 commits - src/cairo-pdf-interchange.c

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sun Feb 21 15:50:35 UTC 2021

 src/cairo-pdf-interchange.c |    7 +++++++
 1 file changed, 7 insertions(+)

New commits:
commit c62c43a8c653f5e4d20ef868065d4f882df9768e
Merge: f4e43b682 ac616c270
Author: Heiko Lewin <hlewin at gmx.de>
Date:   Sun Feb 21 15:50:34 2021 +0000

    Merge branch 'pdf-tag-leak' into 'master'
    Fix a memory leak with cairo_tag_begin() + pdf
    See merge request cairo/cairo!126

commit ac616c270dbcfaf5a70aef97cf989407f757fcbe
Author: Uli Schlachter <psychon at znc.in>
Date:   Sat Feb 13 10:00:42 2021 +0100

    Fix a memory leak with cairo_tag_begin() + pdf
    The error paths in _cairo_pdf_interchange_begin_dest_tag() do not clean
    up and cause some memory to be leaked. Fix this by adding the necessary
    The first hunk, the missing free(dest) was found by oss-fuzz (see link
    The second hunk is an obvious follow up. It also cleans up the memory
    allocated by _cairo_tag_parse_dest_attributes().
    The cleanup in the second hunk is similar to the function
    _named_dest_pluck() in the same function, but that function also removes
    the entry from a hash table.  The error case here is that exactly this
    hash table insertion failed.  Thus, the code cannot simply use the
    already existing function.
    Fixes: https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=30880
    Signed-off-by: Uli Schlachter <psychon at znc.in>

diff --git a/src/cairo-pdf-interchange.c b/src/cairo-pdf-interchange.c
index 0f896d351..434486cc9 100644
--- a/src/cairo-pdf-interchange.c
+++ b/src/cairo-pdf-interchange.c
@@ -1134,13 +1134,20 @@ _cairo_pdf_interchange_begin_dest_tag (cairo_pdf_surface_t    *surface,
 	status = _cairo_tag_parse_dest_attributes (attributes, &dest->attrs);
 	if (unlikely (status))
+	{
+	    free (dest);
 	    return status;
+	}
 	dest->page = _cairo_array_num_elements (&surface->pages);
 	init_named_dest_key (dest);
 	status = _cairo_hash_table_insert (ic->named_dests, &dest->base);
 	if (unlikely (status))
+	{
+	    free (dest->attrs.name);
+	    free (dest);
 	    return status;
+	}
 	_cairo_tag_stack_set_top_data (&ic->analysis_tag_stack, dest);
 	cairo_list_add_tail (&dest->extents.link, &ic->extents_list);

More information about the cairo-commit mailing list