diff options
Diffstat (limited to 'main/libc0.9.32/config-has-fortify.patch')
-rw-r--r-- | main/libc0.9.32/config-has-fortify.patch | 125 |
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 |