Browse Source

fix failure behavior of sem_open when sem does not exist

Rich Felker 14 years ago
parent
commit
682a0f271f
1 changed files with 5 additions and 1 deletions
  1. 5 1
      src/thread/sem_open.c

+ 5 - 1
src/thread/sem_open.c

@@ -100,7 +100,7 @@ sem_t *sem_open(const char *name, int flags, ...)
 					close(tfd);
 					unlink(tmp);
 				}
-				if (fstat(fd, &st) < 0) {
+				if (fd >= 0 && fstat(fd, &st) < 0) {
 					close(fd);
 					fd = -1;
 				}
@@ -118,6 +118,10 @@ sem_t *sem_open(const char *name, int flags, ...)
 				break;
 			}
 		}
+		if (!(flags & O_CREAT)) {
+			pthread_spin_unlock(&lock);
+			return SEM_FAILED;
+		}
 		if (!linkat(AT_FDCWD, tmp, dir, name, 0)) {
 			fd = tfd;
 			close(dir);