12345678910111213141516171819202122232425262728293031 |
- #include <string.h>
- #include <stdint.h>
- #include "pthread_impl.h"
- uintptr_t __stack_chk_guard;
- void __init_ssp(void *entropy)
- {
- if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
- else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
- #if UINTPTR_MAX >= 0xffffffffffffffff
- /* Sacrifice 8 bits of entropy on 64bit to prevent leaking/
- * overwriting the canary via string-manipulation functions.
- * The NULL byte is on the second byte so that off-by-ones can
- * still be detected. Endianness is taken care of
- * automatically. */
- ((char *)&__stack_chk_guard)[1] = 0;
- #endif
- __pthread_self()->canary = __stack_chk_guard;
- }
- void __stack_chk_fail(void)
- {
- a_crash();
- }
- hidden void __stack_chk_fail_local(void);
- weak_alias(__stack_chk_fail, __stack_chk_fail_local);
|