aboutsummaryrefslogtreecommitdiffstats
path: root/main/libc0.9.32/config-has-fortify.patch
blob: 01e26e7e1205af1544f49175c681d657309ca91f (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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
From 82098ab9b853c33ee8ade61c9510b295cc696de1 Mon Sep 17 00:00:00 2001
From: Peter S. Mazinger <ps.m@gmx.net>
Date: Wed, 09 Mar 2011 08:23:48 +0000
Subject: guard *_chk() related stuff with UCLIBC_HAS_FORTIFY

Guard x86_64 memset_chk/memcpy_chk be guarded by UCLIBC_HAS_FORTIFY.
Compile ssp.c if one of SSP/FORTIFY is defined.
Guard __chk_fail() with UCLIBC_HAS_FORTIFY and move its prototype to libc-internal.h.
Disable _FORTIFY_SOURCE if UCLIBC_HAS_FORTIFY is not set.

The config option itself is omitted on purpose,
headers need to be reviewed and generic *_chk() functions need to be first provided.

Signed-off-by: Peter S. Mazinger <ps.m@gmx.net>
---
diff --git a/include/features.h b/include/features.h
index f4d70d7..41e83a9 100644
--- a/include/features.h
+++ b/include/features.h
@@ -198,9 +198,12 @@
 # define __OPTIMIZE_SIZE__   1
 
 /* disable unsupported features */
-# undef _FORTIFY_SOURCE
 # undef __LDBL_COMPAT
 
+# ifndef __UCLIBC_HAS_FORTIFY__
+#  undef _FORTIFY_SOURCE
+# endif
+
 # ifndef __UCLIBC_HAS_THREADS__
 #  if defined _REENTRANT || defined _THREAD_SAFE
 #   warning requested reentrant code, but thread support was disabled
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 443b1fc..3ac0b05 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -65,6 +65,11 @@ libc_hidden_proto(__glibc_strerror_r)
 /* internal access to program name */
 extern const char *__uclibc_progname attribute_hidden;
 
+#  ifdef __UCLIBC_HAS_FORTIFY__
+extern void __chk_fail(void) attribute_noreturn;
+libc_hidden_proto(__chk_fail)
+#  endif
+
 # endif /* IS_IN_libc */
 
 #endif /* __ASSEMBLER__ */
diff --git a/libc/string/x86_64/memcpy.S b/libc/string/x86_64/memcpy.S
index 6d941e0..9c8169b 100644
--- a/libc/string/x86_64/memcpy.S
+++ b/libc/string/x86_64/memcpy.S
@@ -26,12 +26,10 @@
 #define MEMPCPY_P (defined memcpy)
 
         .text
-#if defined __PIC__ && !defined NOT_IN_libc
+#if defined __PIC__ && !defined NOT_IN_libc && defined __UCLIBC_HAS_FORTIFY__
 ENTRY (__memcpy_chk)
 	cmpq	%rdx, %rcx
-#if defined __UCLIBC_HAS_SSP__
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
-#endif
 END (__memcpy_chk)
 #endif
 ENTRY (BP_SYM (memcpy))
diff --git a/libc/string/x86_64/memset.S b/libc/string/x86_64/memset.S
index df265f3..6b758ce 100644
--- a/libc/string/x86_64/memset.S
+++ b/libc/string/x86_64/memset.S
@@ -29,12 +29,10 @@
 #define LARGE $120000
 
         .text
-#if defined __PIC__ && !defined NOT_IN_libc
+#if defined __PIC__ && !defined NOT_IN_libc && defined __UCLIBC_HAS_FORTIFY__
 ENTRY (__memset_chk)
 	cmpq	%rdx, %rcx
-#if defined __UCLIBC_HAS_SSP__
 	jb	HIDDEN_JUMPTARGET (__chk_fail)
-#endif
 END (__memset_chk)
 #endif
 ENTRY (memset)
@@ -144,6 +142,6 @@ END (memset)
 libc_hidden_def(memset)
 #endif
 
-#if !BZERO_P && defined __PIC__ && !defined NOT_IN_libc
+#if !BZERO_P && defined __PIC__ && !defined NOT_IN_libc && defined __UCLIBC_HAS_FORTIFY__
 strong_alias (__memset_chk, __memset_zero_constant_len_parameter)
 #endif
diff --git a/libc/sysdeps/linux/common/ssp.c b/libc/sysdeps/linux/common/ssp.c
index d81c706..df242cc 100644
--- a/libc/sysdeps/linux/common/ssp.c
+++ b/libc/sysdeps/linux/common/ssp.c
@@ -87,6 +87,7 @@ void __stack_smash_handler(char func[], int damaged)
 }
 #endif
 
+#ifdef __UCLIBC_HAS_SSP__
 void __stack_chk_fail(void) attribute_noreturn __cold;
 void __stack_chk_fail(void)
 {
@@ -101,8 +102,9 @@ void __stack_chk_fail(void)
 	while(1)
 		terminate();
 }
+#endif
 
-void __chk_fail(void) attribute_noreturn;
+#ifdef __UCLIBC_HAS_FORTIFY__
 void __chk_fail(void)
 {
 	static const char msg1[] = "buffer overflow detected: ";
@@ -116,4 +119,6 @@ void __chk_fail(void)
 	while(1)
 		terminate();
 }
+libc_hidden_def(__chk_fail)
+#endif
 
--
cgit v0.8.2.1