fix use of uninitialized memory with application-provided thread stacks

the subsequent code in pthread_create and the code which copies TLS
initialization images to the new thread's TLS space assume that the
memory provided to them is zero-initialized, which is true when it's
obtained by pthread_create using mmap. however, when the caller
provides a stack using pthread_attr_setstack, pthread_create cannot
make any assumptions about the contents. simply zero-filling the
relevant memory in this case is the simplest and safest fix.
This commit is contained in:
Rich Felker 2014-08-22 14:05:10 -04:00
parent 321f4fa906
commit a6293285e9
1 changed files with 2 additions and 0 deletions

View File

@ -3,6 +3,7 @@
#include "stdio_impl.h" #include "stdio_impl.h"
#include "libc.h" #include "libc.h"
#include <sys/mman.h> #include <sys/mman.h>
#include <string.h>
static void dummy_0() static void dummy_0()
{ {
@ -175,6 +176,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
if (need < size/8 && need < 2048) { if (need < size/8 && need < 2048) {
tsd = stack - __pthread_tsd_size; tsd = stack - __pthread_tsd_size;
stack = tsd - libc.tls_size; stack = tsd - libc.tls_size;
memset(stack, 0, need);
} else { } else {
size = ROUND(need); size = ROUND(need);
guard = 0; guard = 0;