From 6187e3ef9917556d531d7faffbf58145dc3c2230 Mon Sep 17 00:00:00 2001 From: Natanael Copa Date: Thu, 7 May 2015 12:55:08 +0000 Subject: main/fortify-headers: fix realpath() ref #4075 --- ...h-when-stdlib.h-is-included-before-limits.patch | 56 ++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 main/fortify-headers/0001-fix-realpath-when-stdlib.h-is-included-before-limits.patch (limited to 'main/fortify-headers/0001-fix-realpath-when-stdlib.h-is-included-before-limits.patch') diff --git a/main/fortify-headers/0001-fix-realpath-when-stdlib.h-is-included-before-limits.patch b/main/fortify-headers/0001-fix-realpath-when-stdlib.h-is-included-before-limits.patch new file mode 100644 index 000000000..17d0624ee --- /dev/null +++ b/main/fortify-headers/0001-fix-realpath-when-stdlib.h-is-included-before-limits.patch @@ -0,0 +1,56 @@ +From 31d62b60c5b4f1baa795537da898a83e39be9dd1 Mon Sep 17 00:00:00 2001 +From: Natanael Copa +Date: Thu, 7 May 2015 14:41:36 +0200 +Subject: [PATCH fortify-headers] fix realpath when stdlib.h is included before + limits.h +To: sin@2f30.org + +If program includes stdlib.h before limits.h without _XOPEN_SOURCE, +_GNU_SOURCE or _BSD_SOURCE explicitly set, then will it always trigger +the trap with musl libc. + +This is becase stdlib.h will pull in features.h which will set +_GNU_SOURCE. This means that the fortify stdlib.h will not include +limits.h but it will still trigger the fortified realpath(), but without +PATH_MAX set. + +We fix this by including system stdlib.h before testing if limits.h +should be included. + +Since PATH_MAX is known at compile time we can also error at compile +time, instead of compiling a broken realpath(). +--- + include/stdlib.h | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/include/stdlib.h b/include/stdlib.h +index 22f1f2b..6629652 100644 +--- a/include/stdlib.h ++++ b/include/stdlib.h +@@ -1,12 +1,12 @@ + #ifndef _FORTIFY_STDLIB_H + #define _FORTIFY_STDLIB_H + ++#include_next ++ + #if defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) || defined(_BSD_SOURCE) + #include_next + #endif + +-#include_next +- + #if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0 && defined(__OPTIMIZE__) && __OPTIMIZE__ > 0 + + #ifdef __cplusplus +@@ -23,7 +23,7 @@ char *realpath(const char *path, char *resolved) + + if (resolved) { + #ifndef PATH_MAX +- __builtin_trap(); ++# error PATH_MAX unset. A fortified realpath will not work. + #else + bos = __builtin_object_size(resolved, 0); + if (PATH_MAX > bos) +-- +2.4.0 + -- cgit v1.2.3