[Spice-devel] [PATCH 15/18] worker: s/validate_area/surface_update_dest
Fabiano FidĂȘncio
fidencio at redhat.com
Mon Nov 23 10:13:18 PST 2015
On Mon, Nov 23, 2015 at 7:11 PM, Frediano Ziglio <fziglio at redhat.com> wrote:
>>
>> From: Marc-André Lureau <marcandre.lureau at gmail.com>
>>
>> ---
>> server/red_worker.c | 35 ++++++++++++++++-------------------
>> 1 file changed, 16 insertions(+), 19 deletions(-)
>>
>> diff --git a/server/red_worker.c b/server/red_worker.c
>> index becd42f..a82a871 100644
>> --- a/server/red_worker.c
>> +++ b/server/red_worker.c
>> @@ -936,26 +936,23 @@ static void image_surface_init(DisplayChannel *display)
>> display->image_surfaces.ops = &image_surfaces_ops;
>> }
>>
>> -static void validate_area(DisplayChannel *display, const SpiceRect *area,
>> uint32_t surface_id)
>> +static void surface_update_dest(RedSurface *surface, const SpiceRect *area)
>> {
>> - RedSurface *surface;
>> + SpiceCanvas *canvas = surface->context.canvas;
>> + int h = area->bottom - area->top;
>> + int stride = surface->context.stride;
>> + uint8_t *line_0 = surface->context.line_0;
>>
>> - surface = &display->surfaces[surface_id];
>> - if (!surface->context.canvas_draws_on_surface) {
>> - SpiceCanvas *canvas = surface->context.canvas;
>> - int h;
>> - int stride = surface->context.stride;
>> - uint8_t *line_0 = surface->context.line_0;
>> + if (surface->context.canvas_draws_on_surface)
>> + return;
>> + if (h == 0)
>> + return;
>>
>> - if (!(h = area->bottom - area->top)) {
>> - return;
>> - }
>> + spice_return_if_fail(stride < 0);
>>
>> - spice_assert(stride < 0);
>> - uint8_t *dest = line_0 + (area->top * stride) + area->left *
>> sizeof(uint32_t);
>> - dest += (h - 1) * stride;
>> - canvas->ops->read_bits(canvas, dest, -stride, area);
>> - }
>> + uint8_t *dest = line_0 + (area->top * stride) + area->left *
>> sizeof(uint32_t);
>> + dest += (h - 1) * stride;
>> + canvas->ops->read_bits(canvas, dest, -stride, area);
>> }
>>
>> /*
>> @@ -1037,7 +1034,7 @@ void display_channel_draw_till(DisplayChannel *display,
>> const SpiceRect *area, i
>> drawable_draw(display, now);
>> display_channel_drawable_unref(display, now);
>> } while (now != surface_last);
>> - validate_area(display, area, surface_id);
>> + surface_update_dest(surface, area);
>> }
>>
>> void display_channel_draw(DisplayChannel *display, const SpiceRect *area,
>> int surface_id)
>> @@ -1074,7 +1071,7 @@ void display_channel_draw(DisplayChannel *display,
>> const SpiceRect *area, int su
>> region_destroy(&rgn);
>>
>> if (!last) {
>> - validate_area(display, area, surface_id);
>> + surface_update_dest(surface, area);
>> return;
>> }
>>
>> @@ -1090,7 +1087,7 @@ void display_channel_draw(DisplayChannel *display,
>> const SpiceRect *area, int su
>> drawable_draw(display, now);
>> display_channel_drawable_unref(display, now);
>> } while (now != last);
>> - validate_area(display, area, surface_id);
>> + surface_update_dest(surface, area);
>> }
>>
>> static int red_process_cursor(RedWorker *worker, uint32_t max_pipe_size, int
>> *ring_is_empty)
>> --
>> 2.4.3
>>
>
> This is an example on how an innocent patch can cause problems... this cause
> a use after free problem!
Btw, I split this patch ...
>
> Frediano
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
More information about the Spice-devel
mailing list