diff options
author | Rich Felker <dalias@aerifal.cx> | 2012-05-03 20:42:45 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2012-05-03 20:42:45 -0400 |
commit | 58aa5f45ed3282751ae118c107ff008d4df765dc (patch) | |
tree | 94859368fee26181f59f2b98911f1c46d146d25b /src/env/__stack_chk_fail.c | |
parent | e765239f334d670e1b68289a2fcaa6b82a3b9666 (diff) | |
download | musl-58aa5f45ed3282751ae118c107ff008d4df765dc.tar.gz musl-58aa5f45ed3282751ae118c107ff008d4df765dc.tar.bz2 musl-58aa5f45ed3282751ae118c107ff008d4df765dc.tar.xz musl-58aa5f45ed3282751ae118c107ff008d4df765dc.zip |
overhaul SSP support to use a real canary
pthread structure has been adjusted to match the glibc/GCC abi for
where the canary is stored on i386 and x86_64. it will need variants
for other archs to provide the added security of the canary's entropy,
but even without that it still works as well as the old "minimal" ssp
support. eventually such changes will be made anyway, since they are
also needed for GCC/C11 thread-local storage support (not yet
implemented).
care is taken not to attempt initializing the thread pointer unless
the program actually uses SSP (by reference to __stack_chk_fail).
Diffstat (limited to 'src/env/__stack_chk_fail.c')
-rw-r--r-- | src/env/__stack_chk_fail.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c index bbba3511..c6d0feb9 100644 --- a/src/env/__stack_chk_fail.c +++ b/src/env/__stack_chk_fail.c @@ -1,11 +1,20 @@ +#include <string.h> +#include <inttypes.h> +#include <elf.h> #include "pthread_impl.h" #include "atomic.h" -void __init_ssp(void) +uintptr_t __stack_chk_guard; + +void __init_ssp(size_t *auxv) { -#ifndef __PIC__ - __pthread_self_init(); -#endif + size_t i; + pthread_t self = __pthread_self_init(); + uintptr_t canary; + for (i=0; auxv[i] && auxv[i]!=AT_RANDOM; i+=2); + if (auxv[i]) memcpy(&canary, (void *)auxv[i+1], sizeof canary); + else canary = (uintptr_t)&canary * 1103515245; + __stack_chk_guard = self->canary = canary; } void __stack_chk_fail(void) |