[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3 1/2] xen/gnttab: Clean up goto tangle in grant_table_init()



On 29/09/17 15:23, Andrew Cooper wrote:
> No functional change.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> ---
> CC: George Dunlap <George.Dunlap@xxxxxxxxxxxxx>
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> CC: Tim Deegan <tim@xxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Juergen Gross <jgross@xxxxxxxx>
> ---
>  xen/common/grant_table.c | 39 +++++++++++++++++++--------------------
>  1 file changed, 19 insertions(+), 20 deletions(-)
> 
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 71706f5..2e4b5e7 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -1732,60 +1732,59 @@ gnttab_grow_table(struct domain *d, unsigned int 
> req_nr_frames)
>  static int
>  grant_table_init(struct domain *d, struct grant_table *gt)
>  {
> -    int ret;
> +    int ret = -ENOMEM;
>  
>      grant_write_lock(gt);
>  
>      if ( gt->active )
>      {
>          ret = -EBUSY;
> -        goto unlock;
> +        goto out;

That's wrong. In case someone is calling grant_table_init() again you
are freeing all resources.


Juergen

>      }
>  
>      /* Active grant table. */
>      gt->active = xzalloc_array(struct active_grant_entry *,
>                                 max_nr_active_grant_frames);
>      if ( gt->active == NULL )
> -        goto no_mem;
> +        goto out;
>  
>      /* Tracking of mapped foreign frames table */
>      gt->maptrack = vzalloc(max_maptrack_frames * sizeof(*gt->maptrack));
>      if ( gt->maptrack == NULL )
> -        goto no_mem;
> +        goto out;
>  
>      /* Shared grant table. */
>      gt->shared_raw = xzalloc_array(void *, max_grant_frames);
>      if ( gt->shared_raw == NULL )
> -        goto no_mem;
> +        goto out;
>  
>      /* Status pages for grant table - for version 2 */
>      gt->status = xzalloc_array(grant_status_t *,
>                                 grant_to_status_frames(max_grant_frames));
>      if ( gt->status == NULL )
> -        goto no_mem;
> +        goto out;
>  
>      ret = gnttab_init_arch(gt);
>      if ( ret )
>          goto out;
>  
>      /* gnttab_grow_table() allocates a min number of frames, so 0 is okay. */
> -    if ( gnttab_grow_table(d, 0) )
> -        goto unlock;
> +    ret = gnttab_grow_table(d, 0) ? 0 : -ENOMEM;
>  
> - no_mem:
> -    ret = -ENOMEM;
>   out:
> -    gnttab_destroy_arch(gt);
> -    xfree(gt->status);
> -    gt->status = NULL;
> -    xfree(gt->shared_raw);
> -    gt->shared_raw = NULL;
> -    vfree(gt->maptrack);
> -    gt->maptrack = NULL;
> -    xfree(gt->active);
> -    gt->active = NULL;
> +    if ( ret )
> +    {
> +        gnttab_destroy_arch(gt);
> +        xfree(gt->status);
> +        gt->status = NULL;
> +        xfree(gt->shared_raw);
> +        gt->shared_raw = NULL;
> +        vfree(gt->maptrack);
> +        gt->maptrack = NULL;
> +        xfree(gt->active);
> +        gt->active = NULL;
> +    }
>  
> - unlock:
>      grant_write_unlock(gt);
>  
>      return ret;
> 


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.