projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix stale locks left behind when pthread_create fails
[musl]
/
src
/
thread
/
pthread_create.c
diff --git
a/src/thread/pthread_create.c
b/src/thread/pthread_create.c
index
4c1deca
..
d11dcfa
100644
(file)
--- 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 (!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);
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);
}
} 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;
}
tsd = map + size - __pthread_tsd_size;
if (!stack) stack = tsd - libc.tls_size;
@@
-188,7
+188,7
@@
int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
if (ret < 0) {
a_dec(&libc.threads_minus_1);
if (ret < 0) {
a_dec(&libc.threads_minus_1);
- munmap(map, size);
+
if (map)
munmap(map, size);
return EAGAIN;
}
return EAGAIN;
}
@@
-202,4
+202,7
@@
int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
*res = new;
return 0;
*res = new;
return 0;
+fail:
+ __release_ptc();
+ return EAGAIN;
}
}