summaryrefslogtreecommitdiffstats
path: root/libc-top-half/musl/src/ipc/semget.c
diff options
context:
space:
mode:
Diffstat (limited to 'libc-top-half/musl/src/ipc/semget.c')
-rw-r--r--libc-top-half/musl/src/ipc/semget.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/libc-top-half/musl/src/ipc/semget.c b/libc-top-half/musl/src/ipc/semget.c
new file mode 100644
index 0000000..2cdf626
--- /dev/null
+++ b/libc-top-half/musl/src/ipc/semget.c
@@ -0,0 +1,19 @@
+#include <sys/sem.h>
+#include <limits.h>
+#include <errno.h>
+#include "syscall.h"
+#include "ipc.h"
+
+int semget(key_t key, int n, int 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 syscall(SYS_ipc, IPCOP_semget, key, n, fl);
+#endif
+}