[cairo] [PATCH 2/2] xcb: Don't crash when swapping a 0-sized glyph
Uli Schlachter
psychon at znc.in
Wed Oct 31 13:46:59 PDT 2012
Hi,
On 31.10.2012 21:13, Adam Jackson wrote:
> malloc(0) needn't return NULL, and on glibc, doesn't. Then we encounter
> a loop of the form do { ... } while (--c), which doesn't do quite what
> you were hoping for when c is initially 0.
>
> Since there's nothing to swap in this case, just bomb out.
[...]
Hi Adam,
could you tell us where you are seeing this? Would it be feasible to add a
suitable test case to the test suite for this?
Also:
Hey Chris, do you still remember what you did last year? If yes, could you
explain to me why the following commit "#if 0"s away the width==0||height==0
case which would likely catch this bug?
> commit af9fbd176b145f042408ef5391eef2a51d7531f8
> Author: Chris Wilson <chris at chris-wilson.co.uk>
> Date: Sat Jul 30 17:28:21 2011 +0100
>
> Introduce a new compositor architecture
> [...]
> diff --git a/src/cairo-xcb-surface-render.c b/src/cairo-xcb-surface-render.c
> index aa9100f..f9d33c7 100644
> --- a/src/cairo-xcb-surface-render.c
> +++ b/src/cairo-xcb-surface-render.c
> [...]
>
> - glyphset_info = _cairo_xcb_scaled_font_get_glyphset_info_for_format (scaled_font,
> - glyph_surface->format);
> -
> +#if 0
> /* If the glyph surface has zero height or width, we create
> * a clear 1x1 surface, to avoid various X server bugs.
> */
> if (glyph_surface->width == 0 || glyph_surface->height == 0) {
> cairo_surface_t *tmp_surface;
>
> - tmp_surface = cairo_image_surface_create (glyphset_info->format, 1, 1);
> + tmp_surface = cairo_image_surface_create (info->format, 1, 1);
> status = tmp_surface->status;
> if (unlikely (status))
> goto BAIL;
> @@ -4340,14 +4363,15 @@ _cairo_xcb_surface_add_glyph (cairo_xcb_connection_t *connection,
>
> glyph_surface = (cairo_image_surface_t *) tmp_surface;
> }
> +#endif
Cheers,
Uli
--
"Every once in a while, declare peace. It confuses the hell out of your enemies"
- 79th Rule of Acquisition
More information about the cairo
mailing list