From 31cfe2300d8b9aee110ba0a7213f6befdd3ffce0 Mon Sep 17 00:00:00 2001 From: Joakim Tjernlund Date: Tue, 28 Sep 2004 13:13:44 +0000 Subject: Atsushi Nemoto writes: Hi. I found a mismatch between uClibc and kernel in semctl definition. In uClibc/libc/misc/sysvipc/sem.c: static inline _syscall4(int, __semctl, int, semid, int, semnum, int, cmd, union semun *, arg); ... int semctl(int semid, int semnum, int cmd, ...) ... arg = va_arg (ap, union semun); ... return __semctl(semid, semnum, cmd, &arg); But kernel's semctl is: asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg) The last argument is an union semun itself, not a pointer to the union. Here is a patch. --- libc/misc/sysvipc/sem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libc') diff --git a/libc/misc/sysvipc/sem.c b/libc/misc/sysvipc/sem.c index 1cc39e7bd..8c9672bad 100644 --- a/libc/misc/sysvipc/sem.c +++ b/libc/misc/sysvipc/sem.c @@ -38,7 +38,7 @@ union semun { #ifdef __NR_semctl #define __NR___semctl __NR_semctl -static inline _syscall4(int, __semctl, int, semid, int, semnum, int, cmd, union semun *, arg); +static inline _syscall4(int, __semctl, int, semid, int, semnum, int, cmd, void *, arg); #endif int semctl(int semid, int semnum, int cmd, ...) @@ -51,7 +51,7 @@ int semctl(int semid, int semnum, int cmd, ...) arg = va_arg (ap, union semun); va_end (ap); #ifdef __NR_semctl - return __semctl(semid, semnum, cmd, &arg); + return __semctl(semid, semnum, cmd, arg.__pad); #else return __syscall_ipc(IPCOP_semctl, semid, semnum, cmd, &arg); #endif -- cgit v1.2.3