Browse Source

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.

Joakim Tjernlund 19 years ago
parent
commit
31cfe2300d
1 changed files with 2 additions and 2 deletions
  1. 2 2
      libc/misc/sysvipc/sem.c

+ 2 - 2
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