[cairo] [PATCH] Avoid potential crash when subsurface's size is less than 0.

Chris Wilson chris at chris-wilson.co.uk
Tue Mar 13 10:13:56 PDT 2012


On Tue, 13 Mar 2012 10:00:52 -0700, Bill Spitzak <spitzak at gmail.com> wrote:
> On 03/12/2012 07:00 PM, Chuanbo Weng wrote:
> > When cairo_surface_create_for_rectangle() get non-integer parameters,
> > the subsurface's size may be negative(e.g x = 0.2, width = 0.7, the
> > final width will be -1). It may cause crash somewhere when use this
> > subsurface. Although fractional surface is ill-defined, we should avoid
> > crash when pass non-integer parameter.
> > ---
> >   src/cairo-surface-subsurface.c |    2 ++
> >   1 files changed, 2 insertions(+), 0 deletions(-)
> >
> > diff --git a/src/cairo-surface-subsurface.c b/src/cairo-surface-subsurface.c
> > index 8590bf0..a9fae4b 100644
> > --- a/src/cairo-surface-subsurface.c
> > +++ b/src/cairo-surface-subsurface.c
> > @@ -483,7 +483,9 @@ cairo_surface_create_for_rectangle (cairo_surface_t *target,
> >       surface->extents.x = ceil (x);
> >       surface->extents.y = ceil (y);
> >       surface->extents.width = floor (x + width) - surface->extents.x;
> > +    surface->extents.width = surface->extents.width>= 0 ? surface->extents.width : 0;
> >       surface->extents.height = floor (y + height) - surface->extents.y;
> > +    surface->extents.height = surface->extents.height>= 0 ? surface->extents.height : 0;
> >
> >       if (target->backend->type == CAIRO_SURFACE_TYPE_SUBSURFACE) {
> >   	/* Maintain subsurfaces as 1-depth */
> 
> Why not use:
> 
>    extents.x = floor(x);
>    extents.width = ceil(width);
> 
> This will produce a positive size as long as width is positive.

I wanted to define an integer surface that never accessed the fractional
pixels outside of its extents. The question is not what to replace that
logic with, but how to handle the user specifying a fractional surface
as a source.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the cairo mailing list