Index: fusl/src/ipc/semget.c |
diff --git a/fusl/src/ipc/semget.c b/fusl/src/ipc/semget.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c4a559db1b0ec1316dc2fa9bc47a538ea552d94a |
--- /dev/null |
+++ b/fusl/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); |
+#ifdef SYS_semget |
+ return syscall(SYS_semget, key, n, fl); |
+#else |
+ return syscall(SYS_ipc, IPCOP_semget, key, n, fl); |
+#endif |
+} |