Patchwork linux-user/syscall.c: Enforce pselect6 sigset size restrictions

login
register
mail settings
Submitter Peter Maydell
Date June 28, 2011, 11:21 a.m.
Message ID <1309260117-28334-1-git-send-email-peter.maydell@linaro.org>
Download mbox | patch
Permalink /patch/102353/
State New
Headers show

Comments

Peter Maydell - June 28, 2011, 11:21 a.m.
Enforce the same restriction on the size of the sigset passed to
pselect6 as the Linux kernel does. This is both correct and silences
a gcc 4.6 warning about a write-only variable.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
This really is the last gcc 4.6 warning fix!

 linux-user/syscall.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)
Riku Voipio - June 28, 2011, 11:51 a.m.
On Tue, Jun 28, 2011 at 12:21:57PM +0100, Peter Maydell wrote:
> Enforce the same restriction on the size of the sigset passed to
> pselect6 as the Linux kernel does. This is both correct and silences
> a gcc 4.6 warning about a write-only variable.

Odd but true, after all the trouble of passing the size as packed variable,
even the kernel bothers nothing but check that it matches with 
sizeof(sigset_t)...

I'll include this and your other two patches for the next round.

Riku
 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
> ---
> This really is the last gcc 4.6 warning fix!
> 
>  linux-user/syscall.c |    5 +++++
>  1 files changed, 5 insertions(+), 0 deletions(-)
> 
> diff --git a/linux-user/syscall.c b/linux-user/syscall.c
> index fed7a8f..feb2501 100644
> --- a/linux-user/syscall.c
> +++ b/linux-user/syscall.c
> @@ -5684,6 +5684,11 @@ abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
>  
>                  if (arg_sigset) {
>                      sig.set = &set;
> +                    if (arg_sigsize != sizeof(*target_sigset)) {
> +                        /* Like the kernel, we enforce correct size sigsets */
> +                        ret = -TARGET_EINVAL;
> +                        goto fail;
> +                    }
>                      target_sigset = lock_user(VERIFY_READ, arg_sigset,
>                                                sizeof(*target_sigset), 1);
>                      if (!target_sigset) {
> -- 
> 1.7.5.3
Peter Maydell - June 28, 2011, 11:54 a.m.
On 28 June 2011 12:51, Riku Voipio <riku.voipio@iki.fi> wrote:
> On Tue, Jun 28, 2011 at 12:21:57PM +0100, Peter Maydell wrote:
>> Enforce the same restriction on the size of the sigset passed to
>> pselect6 as the Linux kernel does. This is both correct and silences
>> a gcc 4.6 warning about a write-only variable.
>
> Odd but true, after all the trouble of passing the size as packed variable,
> even the kernel bothers nothing but check that it matches with
> sizeof(sigset_t)...

I assume they're leaving the door open for implementing that properly
at some later date.

Incidentally, if the qemu target's sigset_t and the host's sigset_t
are different sizes then not just this syscall but I suspect all
the others that use sigset_t will have trouble. Luckily only one
flavour of MIPS has a non-standard sigset_t size :-)

-- PMM
Mike Frysinger - June 28, 2011, 4:14 p.m.
Acked-by: Mike Frysinger <vapier@gentoo.org>
-mike

Patch

diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index fed7a8f..feb2501 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -5684,6 +5684,11 @@  abi_long do_syscall(void *cpu_env, int num, abi_long arg1,
 
                 if (arg_sigset) {
                     sig.set = &set;
+                    if (arg_sigsize != sizeof(*target_sigset)) {
+                        /* Like the kernel, we enforce correct size sigsets */
+                        ret = -TARGET_EINVAL;
+                        goto fail;
+                    }
                     target_sigset = lock_user(VERIFY_READ, arg_sigset,
                                               sizeof(*target_sigset), 1);
                     if (!target_sigset) {