[Spice-devel] [server PATCH 1/8] red_worker: use only RCC_FOREACH_SAFE

Yonit Halperin yhalperi at redhat.com
Mon Jul 8 08:42:12 PDT 2013


Hi,

On 07/08/2013 06:32 AM, Uri Lublin wrote:
> RCC_FOREACH may be dangerous
>
> The following patches replace FOREACH loops with a SAFE version.
> Using unsafe loops may cause spice-server to abort (assert fails).
> Specifically a read/write fail in those loops, may cause the client
> to disconnect, removing the node currently iterated, which cause spice
> to abort in ring_next():
>   -- assertion `pos->next != NULL && pos->prev != NULL' failed
Now that red_channel was fixed to use RING_FOREACH_SAFE where needed, I 
think it would be nicer to reuse red_channel.c code, specifically, 
red_channel_pipes_new_add.

Regards,
Yonit.
> ---
>   server/red_worker.c |   11 ++---------
>   1 files changed, 2 insertions(+), 9 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 825bca0..a7f8d79 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -1113,13 +1113,6 @@ static inline uint64_t red_now(void);
>    *  given a channel, iterate over it's clients
>    */
>
> -#define RCC_FOREACH(link, rcc, channel) \
> -    for (link = ring_get_head(&(channel)->clients),\
> -         rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link);\
> -            (link);                              \
> -            (link) = ring_next(&(channel)->clients, link),\
> -            rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link))
> -
>   #define RCC_FOREACH_SAFE(link, next, rcc, channel) \
>       for (link = ring_get_head(&(channel)->clients),                         \
>            rcc = SPICE_CONTAINEROF(link, RedChannelClient, channel_link),     \
> @@ -1426,9 +1419,9 @@ static void red_push_surface_image(DisplayChannelClient *dcc, int surface_id);
>   static void red_pipes_add_verb(RedChannel *channel, uint16_t verb)
>   {
>       RedChannelClient *rcc;
> -    RingItem *link;
> +    RingItem *link, *next;
>
> -    RCC_FOREACH(link, rcc, channel) {
> +    RCC_FOREACH_SAFE(link, next, rcc, channel) {
>           red_pipe_add_verb(rcc, verb);
>       }
>   }
>



More information about the Spice-devel mailing list