mirror of
git://git.musl-libc.org/musl
synced 2025-01-30 10:32:04 +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);
|
flags &= (O_CREAT|O_EXCL);
|
||||||
|
|
||||||
|
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
||||||
|
|
||||||
/* Early failure check for exclusive open; otherwise the case
|
/* Early failure check for exclusive open; otherwise the case
|
||||||
* where the semaphore already exists is expensive. */
|
* where the semaphore already exists is expensive. */
|
||||||
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
|
if (flags == (O_CREAT|O_EXCL) && access(name, F_OK) == 0) {
|
||||||
errno = EEXIST;
|
errno = EEXIST;
|
||||||
return SEM_FAILED;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* If exclusive mode is not requested, try opening an
|
/* If exclusive mode is not requested, try opening an
|
||||||
* existing file first and fall back to creation. */
|
* existing file first and fall back to creation. */
|
||||||
@ -153,6 +153,9 @@ sem_t *sem_open(const char *name, int flags, ...)
|
|||||||
|
|
||||||
fail:
|
fail:
|
||||||
pthread_setcancelstate(cs, 0);
|
pthread_setcancelstate(cs, 0);
|
||||||
|
LOCK(lock);
|
||||||
|
semtab[slot].sem = 0;
|
||||||
|
UNLOCK(lock);
|
||||||
return SEM_FAILED;
|
return SEM_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user