瀏覽代碼

semctl: fix UB causing crashes on powerpc

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.
rofl0r 11 年之前
父節點
當前提交
2b47a7aff2
共有 1 個文件被更改,包括 8 次插入4 次删除
  1. 8 4
      src/ipc/semctl.c

+ 8 - 4
src/ipc/semctl.c

@@ -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