semctl: fix UB causing crashes on powerpc
authorrofl0r <retnyg@gmx.net>
Thu, 13 Mar 2014 19:27:55 +0000 (20:27 +0100)
committerrofl0r <retnyg@gmx.net>
Thu, 13 Mar 2014 19:52:34 +0000 (20:52 +0100)
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.

src/ipc/semctl.c

index 3d79f5030811e59a50a5eda8dc3cd8b6ae46731c..673a9a8c996b2bd18657b1dff7f6934ec34b2d69 100644 (file)
@@ -11,11 +11,15 @@ union semun {
 
 int semctl(int id, int num, int cmd, ...)
 {
-       union semun arg;
+       union semun arg = {0};
        va_list ap;
-       va_start(ap, cmd);
-       arg = va_arg(ap, union semun);
-       va_end(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