kern/166706: [libc] sem_open(3) incorrectly returns the already
opened named semaphore handle when O_EXCL is used [regression]
Jilles Tjoelker
jilles at stack.nl
Sun Apr 8 17:30:18 UTC 2012
The following reply was made to PR kern/166706; it has been noted by GNATS.
From: Jilles Tjoelker <jilles at stack.nl>
To: bug-followup at FreeBSD.org, davidxu at freebsd.org
Cc: igaztanaga at gmail.com
Subject: Re: kern/166706: [libc] sem_open(3) incorrectly returns the already
opened named semaphore handle when O_EXCL is used [regression]
Date: Sun, 8 Apr 2012 19:26:39 +0200
> [sem_new.c may return success with O_CREAT|O_EXCL if the semaphore
> already exists]
The code in sem_new.c will happily add another reference to an already
open semaphore, even if O_CREAT|O_EXCL were specified.
The below patch fixes this by adding an extra check. It makes the
submitter's test program pass again on head.
What do you think?
Index: lib/libc/gen/sem_new.c
===================================================================
--- lib/libc/gen/sem_new.c (revision 233702)
+++ lib/libc/gen/sem_new.c (working copy)
@@ -162,10 +162,16 @@
_pthread_mutex_lock(&sem_llock);
LIST_FOREACH(ni, &sem_list, next) {
if (strcmp(name, ni->name) == 0) {
- ni->open_count++;
- sem = ni->sem;
- _pthread_mutex_unlock(&sem_llock);
- return (sem);
+ if ((flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL)) {
+ _pthread_mutex_unlock(&sem_llock);
+ errno = EEXIST;
+ return (SEM_FAILED);
+ } else {
+ ni->open_count++;
+ sem = ni->sem;
+ _pthread_mutex_unlock(&sem_llock);
+ return (sem);
+ }
}
}
--
Jilles Tjoelker
More information about the freebsd-bugs
mailing list