Module Name: src Committed By: christos Date: Sat Dec 18 15:54:27 UTC 2010
Modified Files: src/lib/libpthread: pthread.c pthread_int.h Log Message: I've had this patch in my tree for a while and since it only improves the situation, I decided to commit it. There is an inherent problem with ASLR and the way the pthread library is using the thread stack. Our pthread library chooses that stack for each thread strategically so that it can locate the location of the pthread struct for each thread by masking the stack pointer and looking just below the red zone it creates. Unfortunately with ASLR you get many random values for the initial stack, and there are situations where the masked stack base ends up below the base of the stack. (this happens on x86 when the stack base happens to be 0x???02000 for example and your mask is stackmask is 0xffe00000). To fix this, we detect the pathological cases (this happens only in the main thread), allocate more stack, and mprotect it appropriately. Then we stash the main base and the main struct, so that when we look for the pthread struct in pthread__id, we can special case the main thread. Another way to work around the problem is unlimiting stacksize, but the proper way is to use TLS to find the thread structure and not to play games with the thread stacks. To generate a diff of this commit: cvs rdiff -u -r1.117 -r1.118 src/lib/libpthread/pthread.c cvs rdiff -u -r1.72 -r1.73 src/lib/libpthread/pthread_int.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.