diff mbox

ppc64 sys_ipc breakage in 2.6.34-rc2

Message ID 20100322064759.GE24064@kryten (mailing list archive)
State Superseded
Headers show

Commit Message

Anton Blanchard March 22, 2010, 6:47 a.m. UTC
I chased down a fail on ppc64 on 2.6.34-rc2 where an application that uses
shared memory was getting a SEGV.

Commit baed7fc9b580bd3fb8252ff1d9b36eaf1f86b670 (Add generic sys_ipc wrapper)
changed the second argument from an unsigned long to an int. When we call
shmget the system call wrappers for sys_ipc will sign extend second (ie the
size) which truncates it. It took a while to track down because the call
succeeds and strace shows the untruncated size :)

The patch below changes second from an int to an unsigned long which fixes
shmget on ppc64 (and I assume s390, sparc64 and mips64).

Signed-off-by: Anton Blanchard <anton@samba.org>
--

I assume the function prototypes for the other IPC methods would cause us
to sign or zero extend second where appropriate (avoiding any security
issues). Come to think of it, the syscall wrappers for each method should do
that for us as well.

Comments

Andreas Schwab March 22, 2010, 6 p.m. UTC | #1
Anton Blanchard <anton@samba.org> writes:

> diff --git a/ipc/syscall.c b/ipc/syscall.c
> index 355a3da..1d6f53f 100644
> --- a/ipc/syscall.c
> +++ b/ipc/syscall.c
> @@ -13,7 +13,7 @@
>  #include <linux/syscalls.h>
>  #include <linux/uaccess.h>
>  
> -SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second,
> +SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
>  		unsigned long, third, void __user *, ptr, long, fifth)

ipc/syscall.c:17: error: conflicting types for ‘sys_ipc’
include/linux/syscalls.h:691: note: previous declaration of ‘sys_ipc’ was here

Andreas.
Christoph Hellwig March 22, 2010, 8:01 p.m. UTC | #2
On Mon, Mar 22, 2010 at 05:47:59PM +1100, Anton Blanchard wrote:
> The patch below changes second from an int to an unsigned long which fixes
> shmget on ppc64 (and I assume s390, sparc64 and mips64).

Looks good, except that the prototype in the header also needs to be
adjusted.
diff mbox

Patch

diff --git a/ipc/syscall.c b/ipc/syscall.c
index 355a3da..1d6f53f 100644
--- a/ipc/syscall.c
+++ b/ipc/syscall.c
@@ -13,7 +13,7 @@ 
 #include <linux/syscalls.h>
 #include <linux/uaccess.h>
 
-SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second,
+SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
 		unsigned long, third, void __user *, ptr, long, fifth)
 {
 	int version, ret;