summaryrefslogtreecommitdiffstats
path: root/ipc/syscall.c
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2010-03-22 17:47:59 +1100
committerLinus Torvalds <torvalds@linux-foundation.org>2010-03-22 09:57:19 -0700
commit45575f5a426c01ec68cd33d998267ba2f6278fac (patch)
treef34a857f471e5249bda3fca723e4b69ba6ce552c /ipc/syscall.c
parenta90110c61073eab95d1986322693c2b9a8a6a5f6 (diff)
downloadlinux-stable-45575f5a426c01ec68cd33d998267ba2f6278fac.tar.gz
linux-stable-45575f5a426c01ec68cd33d998267ba2f6278fac.tar.bz2
linux-stable-45575f5a426c01ec68cd33d998267ba2f6278fac.zip
ppc64 sys_ipc breakage in 2.6.34-rc2
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. Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'ipc/syscall.c')
-rw-r--r--ipc/syscall.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/ipc/syscall.c b/ipc/syscall.c
index 355a3da9ec73..1d6f53f6b562 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;