it's UB to fetch variadic args when none are passed, and this caused real crashes on ppc due to its calling convention, which defines that for variadic functions aggregate types be passed as pointers. the assignment caused that pointer to get dereferenced, resulting in a crash.
28 lines
605 B
C
28 lines
605 B
C
#include <sys/sem.h>
|
|
#include <stdarg.h>
|
|
#include "syscall.h"
|
|
#include "ipc.h"
|
|
|
|
union semun {
|
|
int val;
|
|
struct semid_ds *buf;
|
|
unsigned short *array;
|
|
};
|
|
|
|
int semctl(int id, int num, int cmd, ...)
|
|
{
|
|
union semun arg = {0};
|
|
va_list ap;
|
|
switch (cmd) {
|
|
case SETVAL: case GETALL: case SETALL: case IPC_STAT: case IPC_SET:
|
|
case IPC_INFO: case SEM_INFO: case SEM_STAT:
|
|
va_start(ap, cmd);
|
|
arg = va_arg(ap, union semun);
|
|
va_end(ap);
|
|
}
|
|
#ifdef SYS_semctl
|
|
return syscall(SYS_semctl, id, num, cmd | IPC_64, arg.buf);
|
|
#else
|
|
return syscall(SYS_ipc, IPCOP_semctl, id, num, cmd | IPC_64, &arg.buf);
|
|
#endif
|
|
}
|