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

Re: [Xen-devel] [PATCH] x86/hvm: Correct hvm_ioreq_server_alloc_rangesets() failure path



> -----Original Message-----
> From: Andrew Cooper [mailto:andrew.cooper3@xxxxxxxxxx]
> Sent: 04 June 2014 12:01
> To: Xen-devel
> Cc: Andrew Cooper; Keir (Xen.org); Jan Beulich; Paul Durrant
> Subject: [PATCH] x86/hvm: Correct hvm_ioreq_server_alloc_rangesets()
> failure path
> 
> Coverity-ID: 1220092 "Unsigned compare against 0"
> Coverity-ID: 1220093 "Out-of-bounds read"
> 
> Both of these are cased by the the while() loop in the fail path, which
> results in an infinite loop and memory corruption from rangeset_destroy().
> 
> Move hvm_ioreq_server_free_rangesets() up and use it for cleanup on the
> failure path.
> 
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
> CC: Keir Fraser <keir@xxxxxxx>
> CC: Jan Beulich <JBeulich@xxxxxxxx>
> CC: Paul Durrant <paul.durrant@xxxxxxxxxx>

Reviewed-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

> ---
>  xen/arch/x86/hvm/hvm.c |   27 +++++++++++++--------------
>  1 file changed, 13 insertions(+), 14 deletions(-)
> 
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index 4f993f4..1f13329 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -824,6 +824,18 @@ static void hvm_ioreq_server_unmap_pages(struct
> hvm_ioreq_server *s,
>      }
>  }
> 
> +static void hvm_ioreq_server_free_rangesets(struct hvm_ioreq_server *s,
> +                                            bool_t is_default)
> +{
> +    unsigned int i;
> +
> +    if ( is_default )
> +        return;
> +
> +    for ( i = 0; i < NR_IO_RANGE_TYPES; i++ )
> +        rangeset_destroy(s->range[i]);
> +}
> +
>  static int hvm_ioreq_server_alloc_rangesets(struct hvm_ioreq_server *s,
>                                              bool_t is_default)
>  {
> @@ -861,24 +873,11 @@ static int hvm_ioreq_server_alloc_rangesets(struct
> hvm_ioreq_server *s,
>      return 0;
> 
>   fail:
> -    while ( --i >= 0 )
> -        rangeset_destroy(s->range[i]);
> +    hvm_ioreq_server_free_rangesets(s, 0);
> 
>      return rc;
>  }
> 
> -static void hvm_ioreq_server_free_rangesets(struct hvm_ioreq_server *s,
> -                                            bool_t is_default)
> -{
> -    unsigned int i;
> -
> -    if ( is_default )
> -        return;
> -
> -    for ( i = 0; i < NR_IO_RANGE_TYPES; i++ )
> -        rangeset_destroy(s->range[i]);
> -}
> -
>  static void hvm_ioreq_server_enable(struct hvm_ioreq_server *s,
>                                      bool_t is_default)
>  {
> --
> 1.7.10.4


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


 


Rackspace

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