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#include <stdio.h>
28#include <stdlib.h>
29
30#include <sys/types.h>
31#include <sys/cdefs.h>
32#include <Availability.h>
33
34#include <_types.h>
35extern void arc4random_buf(void *_buf, size_t n);
36extern void stop(const char *format, ...);
37extern void halt(void);
38
39#define __arraycount(__x) (sizeof(__x) / sizeof(__x[0]))
40
41long __stack_chk_guard[8] = {0, 0, 0, 0, 0, 0, 0, 0};
42
43//__private_extern__ void __guard_setup(void) /*__attribute__ ((visibility ("hidden")))*/;
44void __guard_setup(void) __attribute__((constructor));
45
46void __stack_chk_fail(void);
47
48
49void
50__guard_setup(void)
51{
52if (__stack_chk_guard[0]!=0) return;
53
54size_t i;
55long guard[__arraycount(__stack_chk_guard)];
56
57arc4random_buf(guard, sizeof(guard));
58for (i = 0; i < __arraycount(guard); i++)
59__stack_chk_guard[i] = guard[i];
60
61if (__stack_chk_guard[0]!=0 && *__stack_chk_guard != 0) return;
62
63/* If a random generator can't be used, the protector switches the guard
64 to the "terminator canary" */
65((char*)__stack_chk_guard)[0] = 0; ((char*)__stack_chk_guard)[1] = 0;
66((char*)__stack_chk_guard)[2] = '\n'; ((char*)__stack_chk_guard)[3] = 255;
67
68}
69
70void
71__stack_chk_fail()
72{
73#ifndef BOOT1
74printf("stack overflow");
75#endif
76halt();
77}
78

Archive Download this file

Revision: 2182