summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2013-02-01 22:25:19 -0500
committerRich Felker <dalias@aerifal.cx>2013-02-01 22:25:19 -0500
commit72768ea99e67162b7b42d9cd8917cf9a2c00f1f1 (patch)
tree9e28217bb6c04a28a16b3e0a142f0b62ff7696e2
parent077549e0d468ff47fdf3e00bb3cfdb929ac8324f (diff)
downloadmusl-72768ea99e67162b7b42d9cd8917cf9a2c00f1f1.tar.gz
fix stale locks left behind when pthread_create fails
this bug seems to have been around a long time.
-rw-r--r--src/thread/pthread_create.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
index 1e55a6f9..d11dcfaf 100644
--- a/src/thread/pthread_create.c
+++ b/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;
}