summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2016-02-07 22:12:39 +0000
committerjilles <jilles@FreeBSD.org>2016-02-07 22:12:39 +0000
commitb2791f185cba92ad0c81fd19ad5ab4d88fd2681c (patch)
treed1ff67b50654cbedfcbd100e9ccea7def00ef75f /sys/kern
parent6e7e5621d9b1fb2151c468d82074db9c0e91b6ee (diff)
downloadFreeBSD-src-b2791f185cba92ad0c81fd19ad5ab4d88fd2681c.zip
FreeBSD-src-b2791f185cba92ad0c81fd19ad5ab4d88fd2681c.tar.gz
semget(): Check for [EEXIST] error first.
Although POSIX literally permits failing with [EINVAL] if IPC_CREAT and IPC_EXCL were both passed, the semaphore set already exists and has fewer semaphores than nsems, this does not allow an application to retry safely: if the [EINVAL] is actually because of the semmsl limit, an infinite loop would result. PR: 206927
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/sysv_sem.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/sys/kern/sysv_sem.c b/sys/kern/sysv_sem.c
index d9324f4..22616b9 100644
--- a/sys/kern/sysv_sem.c
+++ b/sys/kern/sysv_sem.c
@@ -867,6 +867,11 @@ sys_semget(struct thread *td, struct semget_args *uap)
}
if (semid < seminfo.semmni) {
DPRINTF(("found public key\n"));
+ if ((semflg & IPC_CREAT) && (semflg & IPC_EXCL)) {
+ DPRINTF(("not exclusive\n"));
+ error = EEXIST;
+ goto done2;
+ }
if ((error = ipcperm(td, &sema[semid].u.sem_perm,
semflg & 0700))) {
goto done2;
@@ -876,11 +881,6 @@ sys_semget(struct thread *td, struct semget_args *uap)
error = EINVAL;
goto done2;
}
- if ((semflg & IPC_CREAT) && (semflg & IPC_EXCL)) {
- DPRINTF(("not exclusive\n"));
- error = EEXIST;
- goto done2;
- }
#ifdef MAC
error = mac_sysvsem_check_semget(cred, &sema[semid]);
if (error != 0)
OpenPOWER on IntegriCloud