提交 a033cd22 编写于 作者: R Rich Felker

fix bug whereby sem_open leaked its own internal slots on failure

上级 52d4444f
......@@ -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;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册