Chameleon

Chameleon Svn Source Tree

Root/branches/cparm/i386/libsaio/stack_protector.c

1/*
2 * Copyright (c) 2002 Hiroaki Etoh, Federico G. Schwindt, and Miodrag Vallat.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 * DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT,
18 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
22 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
23 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 * POSSIBILITY OF SUCH DAMAGE.
25 *
26 */
27
28
29#include "libsaio.h"
30
31#define __arraycount(__x) (sizeof(__x) / sizeof(__x[0]))
32
33long __stack_chk_guard[8] = {0, 0, 0, 0, 0, 0, 0, 0};
34
35//__private_extern__ void __guard_setup(void) /*__attribute__ ((visibility ("hidden")))*/;
36void __guard_setup(void) __attribute__((constructor));
37
38void __stack_chk_fail(void);
39
40
41void
42__guard_setup(void)
43{
44if (__stack_chk_guard[0]!=0) return;
45
46size_t i;
47long guard[__arraycount(__stack_chk_guard)];
48
49arc4random_buf(guard, sizeof(guard));
50for (i = 0; i < __arraycount(guard); i++)
51__stack_chk_guard[i] = guard[i];
52
53if (__stack_chk_guard[0]!=0 && *__stack_chk_guard != 0) return;
54
55/* If a random generator can't be used, the protector switches the guard
56 to the "terminator canary" */
57((char*)__stack_chk_guard)[0] = 0; ((char*)__stack_chk_guard)[1] = 0;
58((char*)__stack_chk_guard)[2] = '\n'; ((char*)__stack_chk_guard)[3] = 255;
59
60}
61
62void
63__stack_chk_fail()
64{
65#ifndef BOOT1
66stop("stack overflow");
67#endif
68for(;;);
69}
70

Archive Download this file

Revision: 2057