about summary refs log tree commit diff
path: root/src/env/__stack_chk_fail.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2014-03-25 21:50:15 +0200
committerRich Felker <dalias@aerifal.cx>2014-03-25 19:12:45 -0400
commit2b74315d8a31ad8fbcd369116c82e055e0ec3fb7 (patch)
tree38c6947cf66ea892c50129dc5f5090ccd4ac22cb /src/env/__stack_chk_fail.c
parent436d3723afcb1ee40eb849d56fd0472d83dd598c (diff)
downloadmusl-2b74315d8a31ad8fbcd369116c82e055e0ec3fb7.tar.gz
musl-2b74315d8a31ad8fbcd369116c82e055e0ec3fb7.tar.xz
musl-2b74315d8a31ad8fbcd369116c82e055e0ec3fb7.zip
remove lazy ssp initialization
now that thread pointer is initialized always, ssp canary
initialization can be done unconditionally. this simplifies
the ldso as it does not try to detect ssp usage, and the
init function itself as it is always called exactly once.
this also merges ssp init path for shared and static linking.
Diffstat (limited to 'src/env/__stack_chk_fail.c')
-rw-r--r--src/env/__stack_chk_fail.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c
index 00634d38..87ac473d 100644
--- a/src/env/__stack_chk_fail.c
+++ b/src/env/__stack_chk_fail.c
@@ -1,24 +1,16 @@
 #include <string.h>
 #include <stdint.h>
 #include "pthread_impl.h"
-#include "atomic.h"
 
 uintptr_t __stack_chk_guard;
 
 void __init_ssp(void *entropy)
 {
-	/* Here the thread pointer is used without checking whether
-	 * it is available; this will crash if it's not. However,
-	 * this function is only meant to be called if the program
-	 * being run uses stack protector, and in that case, it would
-	 * crash without a thread pointer anyway, so it's better to
-	 * crash early before there is state to be lost on crash. */
-	pthread_t self = __pthread_self();
-	uintptr_t canary;
-	if (entropy) memcpy(&canary, entropy, sizeof canary);
-	else canary = (uintptr_t)&canary * 1103515245;
-	a_cas_l(&__stack_chk_guard, 0, canary);
-	self->canary = __stack_chk_guard;
+	if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
+	else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
+
+	if (libc.has_thread_pointer)
+		__pthread_self()->canary = __stack_chk_guard;
 }
 
 void __stack_chk_fail(void)