x32: fix waitid()
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 24 Dec 2012 04:14:49 +0000 (23:14 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 26 Dec 2012 06:15:03 +0000 (01:15 -0500)
It needs 64bit rusage and 32bit siginfo.  glibc never calls it with
non-NULL rusage pointer, or we would've seen breakage already...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
kernel/compat.c

index 0770ac5..e5cc33c 100644 (file)
@@ -587,7 +587,11 @@ COMPAT_SYSCALL_DEFINE5(waitid,
                return ret;
 
        if (uru) {
-               ret = put_compat_rusage(&ru, uru);
+               /* sys_waitid() overwrites everything in ru */
+               if (COMPAT_USE_64BIT_TIME)
+                       ret = copy_to_user(uru, &ru, sizeof(ru));
+               else
+                       ret = put_compat_rusage(&ru, uru);
                if (ret)
                        return ret;
        }