Przeglądaj źródła

fix stale locks left behind when pthread_create fails

this bug seems to have been around a long time.
Rich Felker 12 lat temu
rodzic
commit
72768ea99e
1 zmienionych plików z 6 dodań i 3 usunięć
  1. 6 3
      src/thread/pthread_create.c

+ 6 - 3
src/thread/pthread_create.c

@@ -142,14 +142,14 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
 	if (!tsd) {
 		if (guard) {
 			map = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0);
-			if (map == MAP_FAILED) return EAGAIN;
+			if (map == MAP_FAILED) goto fail;
 			if (mprotect(map+guard, size-guard, PROT_READ|PROT_WRITE)) {
 				munmap(map, size);
-				return EAGAIN;
+				goto fail;
 			}
 		} else {
 			map = mmap(0, size, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
-			if (map == MAP_FAILED) return EAGAIN;
+			if (map == MAP_FAILED) goto fail;
 		}
 		tsd = map + size - __pthread_tsd_size;
 		if (!stack) stack = tsd - libc.tls_size;
@@ -202,4 +202,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
 
 	*res = new;
 	return 0;
+fail:
+	__release_ptc();
+	return EAGAIN;
 }