Welcome to mirror list, hosted at ThFree Co, Russian Federation.

stack_protector.c « ssp « libc « newlib - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 5e9d75f0f3ff2803fb5df5d6b53d61d0d454ce89 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <sys/cdefs.h>
#include <sys/param.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#if defined(__AMDGCN__) || defined(__nvptx__)
/* Global constructors not supported on this target, yet.  */
uintptr_t __stack_chk_guard = 0x00000aff; /* 0, 0, '\n', 255  */

#else
uintptr_t __stack_chk_guard = 0;

void
__attribute__((__constructor__))
__stack_chk_init (void)
{
  if (__stack_chk_guard != 0)
    return;

#if defined(__CYGWIN__) || defined(__rtems__)
  arc4random_buf(&__stack_chk_guard, sizeof(__stack_chk_guard));
#else
  /* If getentropy is not available, use the "terminator canary". */
  ((unsigned char *)&__stack_chk_guard)[0] = 0;
  ((unsigned char *)&__stack_chk_guard)[1] = 0;
  ((unsigned char *)&__stack_chk_guard)[2] = '\n';
  ((unsigned char *)&__stack_chk_guard)[3] = 255;
#endif
}
#endif

void
__attribute__((__noreturn__))
__stack_chk_fail (void)
{
  char msg[] = "*** stack smashing detected ***: terminated\n";
  write (2, msg, strlen (msg));
  raise (SIGABRT);
  _exit (127);
}

#ifdef __ELF__
void
__attribute__((visibility ("hidden")))
__stack_chk_fail_local (void)
{
	__stack_chk_fail();
}
#endif