blob: 3ff22e020c7f1e3a5f4b2061af7e62a438e236af [file] [log] [blame]
/**
* This file has no copyright assigned and is placed in the Public Domain.
* This file is part of the mingw-w64 runtime package.
* No warranty is given; refer to the file DISCLAIMER.PD within this package.
*/
#define _CRT_RAND_S
#include <stdlib.h>
#include <stdint.h>
void *__stack_chk_guard;
static void __cdecl __attribute__((__constructor__)) init(void)
{
unsigned int ui;
if (__stack_chk_guard != 0)
return;
// Call rand_s from the CRT; this uses a high quality random source
// RtlGenRandom internally. This function is available since XP, and is
// callable in WinStore mode too (since it's from the CRT).
// In the case of msvcrt.dll, our import library provides a small wrapper
// which tries to load the function dynamically, and falls back on
// using RtlRandomGen if not available.
if (rand_s(&ui) == 0) {
__stack_chk_guard = (void*)(intptr_t)ui;
#if __SIZEOF_POINTER__ > 4
rand_s(&ui);
__stack_chk_guard = (void*)(((intptr_t)__stack_chk_guard) << 32 | ui);
#endif
return;
}
// If rand_s failed (it shouldn't), hardcode a nonzero default stack guard.
#if __SIZEOF_POINTER__ > 4
__stack_chk_guard = (void*)0xdeadbeefdeadbeefULL;
#else
__stack_chk_guard = (void*)0xdeadbeef;
#endif
}