X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fipc%2Fsemget.c;h=c4a559db1b0ec1316dc2fa9bc47a538ea552d94a;hp=2dcf6eac5f279913c47cf937f98e9b5f216abb89;hb=062f40ef3e56021f4a9902095867e35cce6d99c4;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01 diff --git a/src/ipc/semget.c b/src/ipc/semget.c index 2dcf6eac..c4a559db 100644 --- a/src/ipc/semget.c +++ b/src/ipc/semget.c @@ -1,12 +1,19 @@ #include +#include +#include #include "syscall.h" #include "ipc.h" int semget(key_t key, int n, int fl) { -#ifdef __NR_semget - return syscall3(__NR_semget, key, n, fl); + /* The kernel uses the wrong type for the sem_nsems member + * of struct semid_ds, and thus might not check that the + * n fits in the correct (per POSIX) userspace type, so + * we have to check here. */ + if (n > USHRT_MAX) return __syscall_ret(-EINVAL); +#ifdef SYS_semget + return syscall(SYS_semget, key, n, fl); #else - return syscall4(__NR_ipc, IPCOP_semget, key, n, fl); + return syscall(SYS_ipc, IPCOP_semget, key, n, fl); #endif }