projects
/
oweals
/
musl.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
52d4444
)
fix bug whereby sem_open leaked its own internal slots on failure
author
Rich Felker
<dalias@aerifal.cx>
Thu, 27 Jun 2013 01:39:15 +0000
(21:39 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Thu, 27 Jun 2013 01:39:15 +0000
(21:39 -0400)
src/thread/sem_open.c
patch
|
blob
|
history
diff --git
a/src/thread/sem_open.c
b/src/thread/sem_open.c
index 8a72d4c62a317314e077716c7569306a349a90c8..66f12ee42000450e5b26ef56b51f11b61ad835ab 100644
(file)
--- a/
src/thread/sem_open.c
+++ b/
src/thread/sem_open.c
@@
-67,15
+67,15
@@
sem_t *sem_open(const char *name, int flags, ...)
flags &= (O_CREAT|O_EXCL);
flags &= (O_CREAT|O_EXCL);
+ pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
+
/* Early failure check for exclusive open; otherwise the case
* where the semaphore already exists is expensive. */
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
errno = EEXIST;
/* Early failure check for exclusive open; otherwise the case
* where the semaphore already exists is expensive. */
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
errno = EEXIST;
-
return SEM_FAILED
;
+
goto fail
;
}
}
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
-
for (;;) {
/* If exclusive mode is not requested, try opening an
* existing file first and fall back to creation. */
for (;;) {
/* If exclusive mode is not requested, try opening an
* existing file first and fall back to creation. */
@@
-153,6
+153,9
@@
sem_t *sem_open(const char *name, int flags, ...)
fail:
pthread_setcancelstate(cs, 0);
fail:
pthread_setcancelstate(cs, 0);
+ LOCK(lock);
+ semtab[slot].sem = 0;
+ UNLOCK(lock);
return SEM_FAILED;
}
return SEM_FAILED;
}