diff options
author | Uli Schlachter <psychon@znc.in> | 2011-10-09 09:39:25 +0200 |
---|---|---|
committer | Uli Schlachter <psychon@znc.in> | 2011-10-09 09:39:25 +0200 |
commit | d825f6a263f9f9b27fa8160243e8a0a7c2778293 (patch) | |
tree | 7fdc5523f8e352eed742a8037ee735c1076c4576 | |
parent | dca4e6c2dd6ebed73abbeb1dd87cb26a3b09685a (diff) |
clip_intersect_boxes: Fix memleak
There were two code path were we already had called
_cairo_boxes_init_for_array() on a local variable, but we tried to return
without going through _cairo_boxes_fini().
Signed-off-by: Uli Schlachter <psychon@znc.in>
-rw-r--r-- | src/cairo-clip-boxes.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/src/cairo-clip-boxes.c b/src/cairo-clip-boxes.c index 1c3f9403..f42b53dd 100644 --- a/src/cairo-clip-boxes.c +++ b/src/cairo-clip-boxes.c @@ -288,8 +288,10 @@ _cairo_clip_intersect_boxes (cairo_clip_t *clip, if (clip->num_boxes) { _cairo_boxes_init_for_array (&clip_boxes, clip->boxes, clip->num_boxes); - if (unlikely (_cairo_boxes_intersect (&clip_boxes, boxes, &clip_boxes))) - return _cairo_clip_set_all_clipped (clip); + if (unlikely (_cairo_boxes_intersect (&clip_boxes, boxes, &clip_boxes))) { + clip = _cairo_clip_set_all_clipped (clip); + goto out; + } if (clip->boxes != &clip->embedded_box) free (clip->boxes); @@ -299,7 +301,8 @@ _cairo_clip_intersect_boxes (cairo_clip_t *clip, } if (boxes->num_boxes == 0) { - return _cairo_clip_set_all_clipped (clip); + clip = _cairo_clip_set_all_clipped (clip); + goto out; } else if (boxes->num_boxes == 1) { clip->boxes = &clip->embedded_box; clip->boxes[0] = boxes->chunks.base[0]; @@ -308,8 +311,6 @@ _cairo_clip_intersect_boxes (cairo_clip_t *clip, clip->boxes = _cairo_boxes_to_array (boxes, &clip->num_boxes, TRUE); } _cairo_boxes_extents (boxes, &limits); - if (boxes == &clip_boxes) - _cairo_boxes_fini (&clip_boxes); _cairo_box_round_to_rectangle (&limits, &extents); if (clip->path == NULL) @@ -323,6 +324,10 @@ _cairo_clip_intersect_boxes (cairo_clip_t *clip, } clip->is_region = FALSE; +out: + if (boxes == &clip_boxes) + _cairo_boxes_fini (&clip_boxes); + return clip; } |