On Sun, Feb 02, 2014 at 03:04:52AM +0000, edgar.igles...@gmail.com wrote:
> From: Stefan Weil <s...@weilnetz.de>
> 
> __put_user can write bytes, words (2 bytes) or longwords (4 bytes).
> Here obviously words should have been written, but bytes were written,
> so values like 0x9c5f were truncated to 0x5f.
> 
> Fix this by changing retcode from uint8_t to to uint16_t in
> target_signal_frame and also in the unused rt_signal_frame.
> 
> This problem was reported by static code analysis (smatch).

Acked-by: Riku Voipio <riku.voi...@linaro.org>

> Cc: qemu-sta...@nongnu.org
> Signed-off-by: Stefan Weil <s...@weilnetz.de>
> Reviewed-by: Peter Maydell <peter.mayd...@linaro.org>
> Tested-by: Edgar E. Iglesias <edgar.igles...@xilinx.com>
> Reviewed-by: Edgar E. Iglesias <edgar.igles...@xilinx.com>
> Signed-off-by: Edgar E. Iglesias <edgar.igles...@xilinx.com>
> ---
>  linux-user/signal.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/linux-user/signal.c b/linux-user/signal.c
> index 01d7c39..82e8592 100644
> --- a/linux-user/signal.c
> +++ b/linux-user/signal.c
> @@ -3659,7 +3659,7 @@ struct target_sigcontext {
>  struct target_signal_frame {
>          struct target_sigcontext sc;
>          uint32_t extramask[TARGET_NSIG_WORDS - 1];
> -        uint8_t retcode[8];       /* Trampoline code. */
> +        uint16_t retcode[4];      /* Trampoline code. */
>  };
>  
>  struct rt_signal_frame {
> @@ -3667,7 +3667,7 @@ struct rt_signal_frame {
>          void *puc;
>          siginfo_t info;
>          struct ucontext uc;
> -        uint8_t retcode[8];       /* Trampoline code. */
> +        uint16_t retcode[4];      /* Trampoline code. */
>  };
>  
>  static void setup_sigcontext(struct target_sigcontext *sc, CPUCRISState *env)
> @@ -3745,8 +3745,8 @@ static void setup_frame(int sig, struct 
> target_sigaction *ka,
>        */
>       err |= __put_user(0x9c5f, frame->retcode+0);
>       err |= __put_user(TARGET_NR_sigreturn, 
> -                       frame->retcode+2);
> -     err |= __put_user(0xe93d, frame->retcode+4);
> +                       frame->retcode + 1);
> +     err |= __put_user(0xe93d, frame->retcode + 2);
>  
>       /* Save the mask.  */
>       err |= __put_user(set->sig[0], &frame->sc.oldmask);
> -- 
> 1.8.3.2
> 

Reply via email to