Commit 2fe749f50b0bec07650ef135b29b1f55bf543869

Authored by Helge Deller
1 parent 8dd95c68f3

parisc: Use compat layer for msgctl, shmat, shmctl and semtimedop syscalls

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>
Cc: <stable@vger.kernel.org> # v3.10+

Showing 2 changed files with 13 additions and 20 deletions Side-by-side Diff

arch/parisc/include/uapi/asm/shmbuf.h
... ... @@ -36,23 +36,16 @@
36 36 unsigned int __unused2;
37 37 };
38 38  
39   -#ifdef CONFIG_64BIT
40   -/* The 'unsigned int' (formerly 'unsigned long') data types below will
41   - * ensure that a 32-bit app calling shmctl(*,IPC_INFO,*) will work on
42   - * a wide kernel, but if some of these values are meant to contain pointers
43   - * they may need to be 'long long' instead. -PB XXX FIXME
44   - */
45   -#endif
46 39 struct shminfo64 {
47   - unsigned int shmmax;
48   - unsigned int shmmin;
49   - unsigned int shmmni;
50   - unsigned int shmseg;
51   - unsigned int shmall;
52   - unsigned int __unused1;
53   - unsigned int __unused2;
54   - unsigned int __unused3;
55   - unsigned int __unused4;
  40 + unsigned long shmmax;
  41 + unsigned long shmmin;
  42 + unsigned long shmmni;
  43 + unsigned long shmseg;
  44 + unsigned long shmall;
  45 + unsigned long __unused1;
  46 + unsigned long __unused2;
  47 + unsigned long __unused3;
  48 + unsigned long __unused4;
56 49 };
57 50  
58 51 #endif /* _PARISC_SHMBUF_H */
arch/parisc/kernel/syscall_table.S
... ... @@ -286,11 +286,11 @@
286 286 ENTRY_COMP(msgsnd)
287 287 ENTRY_COMP(msgrcv)
288 288 ENTRY_SAME(msgget) /* 190 */
289   - ENTRY_SAME(msgctl)
290   - ENTRY_SAME(shmat)
  289 + ENTRY_COMP(msgctl)
  290 + ENTRY_COMP(shmat)
291 291 ENTRY_SAME(shmdt)
292 292 ENTRY_SAME(shmget)
293   - ENTRY_SAME(shmctl) /* 195 */
  293 + ENTRY_COMP(shmctl) /* 195 */
294 294 ENTRY_SAME(ni_syscall) /* streams1 */
295 295 ENTRY_SAME(ni_syscall) /* streams2 */
296 296 ENTRY_SAME(lstat64)
... ... @@ -323,7 +323,7 @@
323 323 ENTRY_SAME(epoll_ctl) /* 225 */
324 324 ENTRY_SAME(epoll_wait)
325 325 ENTRY_SAME(remap_file_pages)
326   - ENTRY_SAME(semtimedop)
  326 + ENTRY_COMP(semtimedop)
327 327 ENTRY_COMP(mq_open)
328 328 ENTRY_SAME(mq_unlink) /* 230 */
329 329 ENTRY_COMP(mq_timedsend)