> > > > 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 ? > > > > No, dcc_add_surface_area_image add an element after l so l->next can't be > NULL. > > > > + 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; > > I would use just "prev" or "l_prev". > > > 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. > > > > Fine with it. > Or maybe you can update "l" directly and use a "curr" instead with > limited scope (inside the "for") and always initialized? > Why not using GLIST_FOREACH_REVERSED ? Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel