qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH for-2.9 3/6] disas/m68k: Avoid unintended sign e


From: Laurent Vivier
Subject: Re: [Qemu-devel] [PATCH for-2.9 3/6] disas/m68k: Avoid unintended sign extension in get_field()
Date: Fri, 3 Mar 2017 19:56:58 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.7.0

Le 03/03/2017 à 16:50, Peter Maydell a écrit :
> In get_field(), we take an 'unsigned char' value and shift it left,
> which implicitly promotes it to 'signed int', before ORing it into an
> 'unsigned long' type.  If 'unsigned long' is 64 bits then this will
> result in a sign extension and the top 32 bits of the result will be
> 1s.  Add explicit casts to unsigned long before shifting to prevent
> this.
> 
> (Spotted by Coverity, CID 715697.)
> 
> Signed-off-by: Peter Maydell <address@hidden>

Reviewed-by: Laurent Vivier <address@hidden>

> ---
>  disas/m68k.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/disas/m68k.c b/disas/m68k.c
> index 073abb9..61b689e 100644
> --- a/disas/m68k.c
> +++ b/disas/m68k.c
> @@ -4685,10 +4685,11 @@ get_field (const unsigned char *data, enum 
> floatformat_byteorders order,
>       /* This is the last byte; zero out the bits which are not part of
>          this field.  */
>       result |=
> -       (*(data + cur_byte) & ((1 << (len - cur_bitshift)) - 1))
> +       (unsigned long)(*(data + cur_byte)
> +                       & ((1 << (len - cur_bitshift)) - 1))
>           << cur_bitshift;
>        else
> -     result |= *(data + cur_byte) << cur_bitshift;
> +     result |= (unsigned long)*(data + cur_byte) << cur_bitshift;
>        cur_bitshift += FLOATFORMAT_CHAR_BIT;
>        if (order == floatformat_little)
>       ++cur_byte;
> 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]