[Spice-devel] [PATCH spice-server] fixup! dcc-send: remove useless pipe_item assignment pipe_item

Uri Lublin uril at redhat.com
Thu Jul 4 13:17:55 UTC 2019


On 7/4/19 12:33 PM, Frediano Ziglio wrote:
> Remove use-after-free introduced by a78a7d251042892182b158650291d19a85bbd6b1
> ---
>   server/dcc-send.c | 9 +++++----
>   1 file changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/server/dcc-send.c b/server/dcc-send.c
> index 565a79f33..4582e3545 100644
> --- a/server/dcc-send.c
> +++ b/server/dcc-send.c
> @@ -725,7 +725,6 @@ static void red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient
>           RedPipeItem *pipe_item = l->data;
>           Drawable *drawable;
>           RedDrawablePipeItem *dpi;
> -        RedImageItem *image;
>   
>           if (pipe_item->type != RED_PIPE_ITEM_TYPE_DRAW)
>               continue;
> @@ -745,14 +744,16 @@ static void red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient
>               continue;
>           }
>   
> -        image = dcc_add_surface_area_image(dcc, drawable->red_drawable->surface_id,
> -                                           &drawable->red_drawable->bbox, l, TRUE);
> +        dcc_add_surface_area_image(dcc, drawable->red_drawable->surface_id,
> +                                   &drawable->red_drawable->bbox, l, TRUE);
>           resent_surface_ids[num_resent] = drawable->red_drawable->surface_id;
>           resent_areas[num_resent] = drawable->red_drawable->bbox;
>           num_resent++;
>   
> -        spice_assert(image);
> +        GList *image_pos = l->next;

l may be the queue tail, and in that case l->next would be
NULL, wouldn't it ?

> +        spice_assert(image_pos);
>           red_channel_client_pipe_remove_and_release_pos(RED_CHANNEL_CLIENT(dcc), l);
> +        l = image_pos;
>       }
>   }
>   
> 

I solved it differently:

diff --git a/server/dcc-send.c b/server/dcc-send.c
index 84fa1be72..255e893f7 100644
--- a/server/dcc-send.c
+++ b/server/dcc-send.c
@@ -713,7 +713,7 @@ static void 
red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient
      int resent_surface_ids[MAX_PIPE_SIZE];
      SpiceRect resent_areas[MAX_PIPE_SIZE]; // not pointers since 
drawables may be released
      int num_resent;
-    GList *l;
+    GList *l, *lprev;
      GQueue *pipe;

      resent_surface_ids[0] = first_surface_id;
@@ -723,12 +723,13 @@ static void 
red_pipe_replace_rendered_drawables_with_images(DisplayChannelClient
      pipe = red_channel_client_get_pipe(RED_CHANNEL_CLIENT(dcc));

      // going from the oldest to the newest
-    for (l = pipe->tail; l != NULL; l = l->prev) {
+    for (l = pipe->tail; l != NULL; l = lprev) {
          RedPipeItem *pipe_item = l->data;
          Drawable *drawable;
          RedDrawablePipeItem *dpi;
          RedImageItem *image;

+        lprev = l->prev;
          if (pipe_item->type != RED_PIPE_ITEM_TYPE_DRAW)
              continue;
          dpi = SPICE_UPCAST(RedDrawablePipeItem, pipe_item);




Uri.


More information about the Spice-devel mailing list