Procházet zdrojové kódy

fix bug whereby sem_open leaked its own internal slots on failure

Rich Felker před 11 roky
rodič
revize
a033cd22aa
1 změnil soubory, kde provedl 6 přidání a 3 odebrání
  1. 6 3
      src/thread/sem_open.c

+ 6 - 3
src/thread/sem_open.c

@@ -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;
 }