mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2025-12-20 04:40:07 +01:00
ps: Fix crash in self-copy-overlap
According to valgrind, there is a use-after-free here. The function _cairo_ps_surface_emit_surface() temporarily replaces some member of a struct and then later re-sets it. However, there is an early return possible that would skip that part of the code. This commit moves the re-set up so that no freed pointers are left behind. This seems to fix the crash. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
c1aaaff880
commit
a2d05a0c34
3 changed files with 3 additions and 1 deletions
|
|
@ -161,6 +161,7 @@ rounded-rectangle-fill
|
|||
rounded-rectangle-stroke
|
||||
scale-offset-image
|
||||
scale-offset-similar
|
||||
self-copy-overlap
|
||||
stroke-ctm-caps
|
||||
stroke-clipped
|
||||
stroke-image
|
||||
|
|
|
|||
|
|
@ -172,6 +172,7 @@ rounded-rectangle-fill
|
|||
rounded-rectangle-stroke
|
||||
scale-offset-image
|
||||
scale-offset-similar
|
||||
self-copy-overlap
|
||||
stroke-ctm-caps
|
||||
stroke-clipped
|
||||
stroke-image
|
||||
|
|
|
|||
|
|
@ -3713,11 +3713,11 @@ _cairo_ps_surface_emit_surface (cairo_ps_surface_t *surface,
|
|||
|
||||
status = _cairo_memory_stream_destroy (surface->stream, &data, &length);
|
||||
free (data);
|
||||
surface->stream = old_stream;
|
||||
if (unlikely (status))
|
||||
return status;
|
||||
|
||||
params->approx_size = length;
|
||||
surface->stream = old_stream;
|
||||
_cairo_pdf_operators_set_stream (&surface->pdf_operators,
|
||||
surface->stream);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue