summaryrefslogtreecommitdiff
path: root/src/env
diff options
context:
space:
mode:
Diffstat (limited to 'src/env')
-rw-r--r--src/env/__init_security.c6
-rw-r--r--src/env/__stack_chk_fail.c17
-rw-r--r--src/env/__stack_chk_guard.c2
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;