#include <os/assumes.h>
#include <stdint.h>
#include <TargetConditionals.h>
#include "crt_externs.h"
#ifndef PR_13085474_CHECK
#define PR_13085474_CHECK TARGET_OS_OSX
#endif
#if PR_13085474_CHECK
#include <libkern/OSAtomic.h>
#include <mach-o/dyld.h>
#include <mach-o/dyld_priv.h>
#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
__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
__chk_fail_overflow (void) {
os_crash("detected buffer overflow");
}
__attribute__ ((visibility ("hidden")))
__attribute__ ((noreturn))
void
__chk_fail_overlap (void) {
os_crash("detected source and destination buffer overlap");
}
__attribute__ ((visibility ("hidden")))
void
__chk_overlap (const void *_a, size_t an, const void *_b, size_t bn) {
uintptr_t a = (uintptr_t)_a;
uintptr_t b = (uintptr_t)_b;
if (__builtin_expect(an == 0 || bn == 0, 0)) {
return;
} else if (__builtin_expect(a == b, 0)) {
__chk_fail_overlap();
} else if (a < b) {
if (__builtin_expect(a + an > b, 0))
__chk_fail_overlap();
} else { if (__builtin_expect(b + bn > a, 0))
__chk_fail_overlap();
}
}