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
35void __guard_setup(void) __attribute__ ((visibility ("hidden")));
36
37void __stack_chk_fail(void);
38
39
40void
41__guard_setup(void)
42{
43if (__stack_chk_guard[0]!=0) return;
44
45size_t i;
46long guard[__arraycount(__stack_chk_guard)];
47
48arc4rand(guard, sizeof(guard), 0);
49for (i = 0; i < __arraycount(guard); i++)
50__stack_chk_guard[i] = guard[i];
51
52if (__stack_chk_guard[0]!=0 && *__stack_chk_guard != 0) return;
53
54/* If a random generator can't be used, the protector switches the guard
55 to the "terminator canary" */
56((char*)__stack_chk_guard)[0] = 0; ((char*)__stack_chk_guard)[1] = 0;
57((char*)__stack_chk_guard)[2] = '\n'; ((char*)__stack_chk_guard)[3] = 255;
58
59}
60
61void
62__stack_chk_fail()
63{
64#ifndef BOOT1
65 stop("stack overflow");
66#endif
67 for(;;);
68}
69

Archive Download this file

Revision: 1804