mirror of
git://git.musl-libc.org/musl
synced 2025-01-30 02:22:43 +00:00
fix bug whereby sem_open leaked its own internal slots on failure
This commit is contained in:
parent
52d4444f8e
commit
a033cd22aa
@ -67,15 +67,15 @@ sem_t *sem_open(const char *name, int flags, ...)
|
||||
|
||||
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;
|
||||
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. */
|
||||
@ -153,6 +153,9 @@ sem_t *sem_open(const char *name, int flags, ...)
|
||||
|
||||
fail:
|
||||
pthread_setcancelstate(cs, 0);
|
||||
LOCK(lock);
|
||||
semtab[slot].sem = 0;
|
||||
UNLOCK(lock);
|
||||
return SEM_FAILED;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user