diff options
Diffstat (limited to 'src/env')
-rw-r--r-- | src/env/__init_security.c | 6 | ||||
-rw-r--r-- | src/env/__stack_chk_fail.c | 17 | ||||
-rw-r--r-- | src/env/__stack_chk_guard.c | 2 |
3 files changed, 17 insertions, 8 deletions
diff --git a/src/env/__init_security.c b/src/env/__init_security.c index 6893a252..8270f1f4 100644 --- a/src/env/__init_security.c +++ b/src/env/__init_security.c @@ -8,7 +8,7 @@ #define AUX_CNT 24 -void dummy(void) +void dummy(size_t *auxv) { } weak_alias(dummy, __init_ssp); @@ -18,7 +18,9 @@ void __init_security(size_t *auxv) size_t i, aux[AUX_CNT] = { 0 }; struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} }; - __init_ssp(); +#ifndef SHARED + __init_ssp(auxv); +#endif for (; auxv[0]; auxv+=2) if (auxv[0]<AUX_CNT) aux[auxv[0]] = auxv[1]; if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID] 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) diff --git a/src/env/__stack_chk_guard.c b/src/env/__stack_chk_guard.c deleted file mode 100644 index f4c9e4f5..00000000 --- a/src/env/__stack_chk_guard.c +++ /dev/null @@ -1,2 +0,0 @@ -#include <inttypes.h> -uintptr_t __stack_chk_guard = 0xdecafbad; |