| From 2fe749f50b0bec07650ef135b29b1f55bf543869 Mon Sep 17 00:00:00 2001 |
| From: Helge Deller <deller@gmx.de> |
| Date: Mon, 10 Nov 2014 21:46:18 +0100 |
| Subject: parisc: Use compat layer for msgctl, shmat, shmctl and semtimedop syscalls |
| |
| From: Helge Deller <deller@gmx.de> |
| |
| commit 2fe749f50b0bec07650ef135b29b1f55bf543869 upstream. |
| |
| Switch over the msgctl, shmat, shmctl and semtimedop syscalls to use the compat |
| layer. The problem was found with the debian procenv package, which called |
| shmctl(0, SHM_INFO, &info); |
| in which the shmctl syscall then overwrote parts of the surrounding areas on |
| the stack on which the info variable was stored and thus lead to a segfault |
| later on. |
| |
| Additionally fix the definition of struct shminfo64 to use unsigned longs like |
| the other architectures. This has no impact on userspace since we only have a |
| 32bit userspace up to now. |
| |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Cc: John David Anglin <dave.anglin@bell.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/parisc/include/uapi/asm/shmbuf.h | 25 +++++++++---------------- |
| arch/parisc/kernel/syscall_table.S | 8 ++++---- |
| 2 files changed, 13 insertions(+), 20 deletions(-) |
| |
| --- a/arch/parisc/include/uapi/asm/shmbuf.h |
| +++ b/arch/parisc/include/uapi/asm/shmbuf.h |
| @@ -36,23 +36,16 @@ struct shmid64_ds { |
| unsigned int __unused2; |
| }; |
| |
| -#ifdef CONFIG_64BIT |
| -/* The 'unsigned int' (formerly 'unsigned long') data types below will |
| - * ensure that a 32-bit app calling shmctl(*,IPC_INFO,*) will work on |
| - * a wide kernel, but if some of these values are meant to contain pointers |
| - * they may need to be 'long long' instead. -PB XXX FIXME |
| - */ |
| -#endif |
| struct shminfo64 { |
| - unsigned int shmmax; |
| - unsigned int shmmin; |
| - unsigned int shmmni; |
| - unsigned int shmseg; |
| - unsigned int shmall; |
| - unsigned int __unused1; |
| - unsigned int __unused2; |
| - unsigned int __unused3; |
| - unsigned int __unused4; |
| + unsigned long shmmax; |
| + unsigned long shmmin; |
| + unsigned long shmmni; |
| + unsigned long shmseg; |
| + unsigned long shmall; |
| + unsigned long __unused1; |
| + unsigned long __unused2; |
| + unsigned long __unused3; |
| + unsigned long __unused4; |
| }; |
| |
| #endif /* _PARISC_SHMBUF_H */ |
| --- a/arch/parisc/kernel/syscall_table.S |
| +++ b/arch/parisc/kernel/syscall_table.S |
| @@ -286,11 +286,11 @@ |
| ENTRY_COMP(msgsnd) |
| ENTRY_COMP(msgrcv) |
| ENTRY_SAME(msgget) /* 190 */ |
| - ENTRY_SAME(msgctl) |
| - ENTRY_SAME(shmat) |
| + ENTRY_COMP(msgctl) |
| + ENTRY_COMP(shmat) |
| ENTRY_SAME(shmdt) |
| ENTRY_SAME(shmget) |
| - ENTRY_SAME(shmctl) /* 195 */ |
| + ENTRY_COMP(shmctl) /* 195 */ |
| ENTRY_SAME(ni_syscall) /* streams1 */ |
| ENTRY_SAME(ni_syscall) /* streams2 */ |
| ENTRY_SAME(lstat64) |
| @@ -323,7 +323,7 @@ |
| ENTRY_SAME(epoll_ctl) /* 225 */ |
| ENTRY_SAME(epoll_wait) |
| ENTRY_SAME(remap_file_pages) |
| - ENTRY_SAME(semtimedop) |
| + ENTRY_COMP(semtimedop) |
| ENTRY_COMP(mq_open) |
| ENTRY_SAME(mq_unlink) /* 230 */ |
| ENTRY_COMP(mq_timedsend) |