[Spice-devel] [spice-server v2 5/9] qxl: Fix guest resources release in red_put_drawable()

Frediano Ziglio fziglio at redhat.com
Tue Apr 17 19:04:40 UTC 2018


> 
> At the moment, we'll unconditionally release the guest QXL resources in
> red_put_drawable() even if red_get_drawable() failed and did not
> initialize drawable->release_info_ext properly.
> This commit checks the QXLReleaseInfo in release_info_ext is non-0

You forget to update the comment

> before attempting to release it.
> 
> Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
> ---
>  server/red-parse-qxl.c | 20 ++++++++++++--------
>  1 file changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/server/red-parse-qxl.c b/server/red-parse-qxl.c
> index cc6a8b51d..ccb01d92d 100644
> --- a/server/red-parse-qxl.c
> +++ b/server/red-parse-qxl.c
> @@ -1012,7 +1012,7 @@ static void red_put_clip(SpiceClip *red)
>      }
>  }
>  
> -static bool red_get_native_drawable(RedMemSlotInfo *slots, int group_id,
> +static bool red_get_native_drawable(QXLInstance *qxl_instance,
> RedMemSlotInfo *slots, int group_id,
>                                      RedDrawable *red, QXLPHYSICAL addr,
>                                      uint32_t flags)
>  {
>      QXLDrawable *qxl;
> @@ -1023,6 +1023,7 @@ static bool red_get_native_drawable(RedMemSlotInfo
> *slots, int group_id,
>      if (error) {
>          return false;
>      }
> +    red->qxl = qxl_instance;

already updated in red_get_drawable

>      red->release_info_ext.info     = &qxl->release_info;
>      red->release_info_ext.group_id = group_id;
>  
> @@ -1093,7 +1094,7 @@ static bool red_get_native_drawable(RedMemSlotInfo
> *slots, int group_id,
>      return true;
>  }
>  
> -static bool red_get_compat_drawable(RedMemSlotInfo *slots, int group_id,
> +static bool red_get_compat_drawable(QXLInstance *qxl_instance,
> RedMemSlotInfo *slots, int group_id,
>                                      RedDrawable *red, QXLPHYSICAL addr,
>                                      uint32_t flags)
>  {
>      QXLCompatDrawable *qxl;
> @@ -1103,6 +1104,7 @@ static bool red_get_compat_drawable(RedMemSlotInfo
> *slots, int group_id,
>      if (error) {
>          return false;
>      }
> +    red->qxl = qxl_instance;

here too

>      red->release_info_ext.info     = &qxl->release_info;
>      red->release_info_ext.group_id = group_id;
>  
> @@ -1176,15 +1178,16 @@ static bool red_get_compat_drawable(RedMemSlotInfo
> *slots, int group_id,
>      return true;
>  }
>  
> -static bool red_get_drawable(RedMemSlotInfo *slots, int group_id,
> +static bool red_get_drawable(QXLInstance *qxl, RedMemSlotInfo *slots, int
> group_id,
>                               RedDrawable *red, QXLPHYSICAL addr, uint32_t
>                               flags)
>  {
>      bool ret;
>  
> +    red->qxl = qxl;
>      if (flags & QXL_COMMAND_FLAG_COMPAT) {
> -        ret = red_get_compat_drawable(slots, group_id, red, addr, flags);
> +        ret = red_get_compat_drawable(qxl, slots, group_id, red, addr,
> flags);
>      } else {
> -        ret = red_get_native_drawable(slots, group_id, red, addr, flags);
> +        ret = red_get_native_drawable(qxl, slots, group_id, red, addr,
> flags);
>      }
>      return ret;
>  }
> @@ -1487,7 +1490,9 @@ void red_drawable_unref(RedDrawable *red_drawable)
>      if (--red_drawable->refs) {
>          return;
>      }
> -    red_qxl_release_resource(red_drawable->qxl,
> red_drawable->release_info_ext);
> +    if (red_drawable->qxl != NULL) {
> +        red_qxl_release_resource(red_drawable->qxl,
> red_drawable->release_info_ext);
> +    }

move in red_put_drawable ?

>      red_put_drawable(red_drawable);
>      g_free(red_drawable);
>  }
> @@ -1499,9 +1504,8 @@ RedDrawable *red_drawable_new(QXLInstance *qxl,
> RedMemSlotInfo *slots,
>      RedDrawable *red = g_new0(RedDrawable, 1);
>  
>      red->refs = 1;
> -    red->qxl = qxl;
>  
> -    if (!red_get_drawable(slots, group_id, red, addr, flags)) {
> +    if (!red_get_drawable(qxl, slots, group_id, red, addr, flags)) {
>         red_drawable_unref(red);
>         return NULL;
>      }

Frediano


More information about the Spice-devel mailing list