From 28300737d9bfa684aac372729e0148b22c4ded2b Mon Sep 17 00:00:00 2001 From: Apple Date: Tue, 24 Mar 2020 21:32:37 +0000 Subject: [PATCH] Libc-1353.41.1.tar.gz --- os/assumes.c | 22 --------------------- secure/chk_fail.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++ sys/_libc_init.c | 2 ++ 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/os/assumes.c b/os/assumes.c index 3f711f7..389fe17 100644 --- a/os/assumes.c +++ b/os/assumes.c @@ -63,8 +63,6 @@ typedef struct dl_info { #define OSX_ASSUMES_LOG_REDIRECT_SECT_NAME "__osx_log_func" #define os_atomic_cmpxchg(p, o, n) __sync_bool_compare_and_swap((p), (o), (n)) -static bool _os_should_abort_on_assumes = false; - #if !TARGET_OS_DRIVERKIT static const char * _os_basename(const char *p) @@ -127,34 +125,14 @@ _os_get_image_uuid(void *hdr, uuid_t uuid) } #endif -static void -_os_abort_on_assumes_once(void) -{ - /* Embedded boot-args can get pretty long. Let's just hope this is big - * enough. - */ - char bootargs[2048]; - size_t len = sizeof(bootargs) - 1; - - if (sysctlbyname("kern.bootargs", bootargs, &len, NULL, 0) == 0) { - if (strnstr(bootargs, "-os_assumes_fatal", len)) { - _os_should_abort_on_assumes = true; - } - } -} - static bool _os_abort_on_assumes(void) { - static pthread_once_t once = PTHREAD_ONCE_INIT; bool result = false; if (getpid() != 1) { if (getenv("OS_ASSUMES_FATAL")) { result = true; - } else { - pthread_once(&once, _os_abort_on_assumes_once); - result = _os_should_abort_on_assumes; } } else { if (getenv("OS_ASSUMES_FATAL_PID1")) { diff --git a/secure/chk_fail.c b/secure/chk_fail.c index 596ce44..9dc6c00 100644 --- a/secure/chk_fail.c +++ b/secure/chk_fail.c @@ -24,10 +24,59 @@ #include #include #include +#include "crt_externs.h" +#ifndef PR_13085474_CHECK +#define PR_13085474_CHECK TARGET_OS_OSX +#endif + +#if PR_13085474_CHECK +/* Some shipped applications fail this check and were tested against + * versions of these functions that supported overlapping buffers. + * + * We would rather let such applications run, using the old memmove + * implementation, than abort() because they can't use the new + * implementation. + */ + +#include +#include +#include +#if TARGET_OS_OSX +#define START_VERSION dyld_platform_version_macOS_10_9 +#else +#error "This platform should not build with PR_13085474_CHECK=1" +#endif +#endif /* !PR_13085474_CHECK */ + +/* For PR_13085474_CHECK set, we initialize __chk_assert_no_overlap to + * 1 initially and then reset it to 0 if the main image of the process + * was linked earlier than 10.9. + * + * If PR_13085474_CHECK is zero, then we never do any sdk version checking + * and always do overlap checks. + */ __attribute__ ((visibility ("hidden"))) uint32_t __chk_assert_no_overlap = 1; +#if PR_13085474_CHECK +static bool +__chk_assert_sdk_pre_start(const struct mach_header *mh) { + return (dyld_get_active_platform() == PLATFORM_MACOS && + !dyld_sdk_at_least(mh, START_VERSION)); +} +#endif + +__attribute__ ((visibility ("hidden"))) +void __chk_init(void) { +#if PR_13085474_CHECK + if (__chk_assert_sdk_pre_start((const struct mach_header *) + _NSGetMachExecuteHeader())) { + __chk_assert_no_overlap = 0; + } +#endif +} + __attribute__ ((visibility ("hidden"))) __attribute__ ((noreturn)) void diff --git a/sys/_libc_init.c b/sys/_libc_init.c index 54790ce..3f95640 100644 --- a/sys/_libc_init.c +++ b/sys/_libc_init.c @@ -41,6 +41,7 @@ extern void _arc4_init(void); extern void __atexit_init(void); extern void __confstr_init(const struct _libc_functions *funcs); extern void _init_clock_port(void); +extern void __chk_init(void); extern void __xlocale_init(void); extern void __guard_setup(const char *apple[]); @@ -55,6 +56,7 @@ _libc_initializer(const struct _libc_functions *funcs, __confstr_init(funcs); __atexit_init(); _init_clock_port(); + __chk_init(); __xlocale_init(); __guard_setup(apple); } -- 2.47.2