diff options
| author | Rich Felker <dalias@aerifal.cx> | 2013-02-01 22:25:19 -0500 | 
|---|---|---|
| committer | Rich Felker <dalias@aerifal.cx> | 2013-02-01 22:25:19 -0500 | 
| commit | 72768ea99e67162b7b42d9cd8917cf9a2c00f1f1 (patch) | |
| tree | 9e28217bb6c04a28a16b3e0a142f0b62ff7696e2 /src | |
| parent | 077549e0d468ff47fdf3e00bb3cfdb929ac8324f (diff) | |
| download | musl-72768ea99e67162b7b42d9cd8917cf9a2c00f1f1.tar.gz | |
fix stale locks left behind when pthread_create fails
this bug seems to have been around a long time.
Diffstat (limited to 'src')
| -rw-r--r-- | src/thread/pthread_create.c | 9 | 
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;  }  | 
