X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fipc%2Fsemget.c;h=2cdf626b500239d8a7427b23f284698aeea6cbea;hb=4554f155dd23a65fcdfd39f1d5af8af55ba37694;hp=2dcf6eac5f279913c47cf937f98e9b5f216abb89;hpb=0b44a0315b47dd8eced9f3b7f31580cf14bbfc01;p=musl diff --git a/src/ipc/semget.c b/src/ipc/semget.c index 2dcf6eac..2cdf626b 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); +#ifndef SYS_ipc + 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 }