aboutsummaryrefslogtreecommitdiffstats
path: root/main/libc0.9.32/config-has-fortify.patch
diff options
context:
space:
mode:
Diffstat (limited to 'main/libc0.9.32/config-has-fortify.patch')
-rw-r--r--main/libc0.9.32/config-has-fortify.patch125
1 files changed, 125 insertions, 0 deletions
diff --git a/main/libc0.9.32/config-has-fortify.patch b/main/libc0.9.32/config-has-fortify.patch
new file mode 100644
index 0000000000..01e26e7e12
--- /dev/null
+++ b/main/libc0.9.32/config-has-fortify.patch
@@ -0,0 +1,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