diff --git a/compiler-rt/lib/asan/asan_posix.cc b/compiler-rt/lib/asan/asan_posix.cc --- a/compiler-rt/lib/asan/asan_posix.cc +++ b/compiler-rt/lib/asan/asan_posix.cc @@ -39,7 +39,7 @@ // ---------------------- TSD ---------------- {{{1 -#if SANITIZER_NETBSD || SANITIZER_FREEBSD +#if SANITIZER_NETBSD // Thread Static Data cannot be used in early init on NetBSD and FreeBSD. // Reuse the Asan TSD API for compatibility with existing code // with an alternative implementation. diff --git a/compiler-rt/lib/msan/msan_linux.cc b/compiler-rt/lib/msan/msan_linux.cc --- a/compiler-rt/lib/msan/msan_linux.cc +++ b/compiler-rt/lib/msan/msan_linux.cc @@ -174,7 +174,7 @@ // ---------------------- TSD ---------------- {{{1 -#if SANITIZER_NETBSD || SANITIZER_FREEBSD +#if SANITIZER_NETBSD // Thread Static Data cannot be used in early init on NetBSD and FreeBSD. // Reuse the MSan TSD API for compatibility with existing code // with an alternative implementation. diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc --- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cc @@ -777,9 +777,17 @@ } #if SANITIZER_FREEBSD +typedef int (*syctlbyname_ptr)(const char *sname, void *oldp, size_t *oldlenp, + const void *newp, size_t newlen); int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp, const void *newp, uptr newlen) { - return sysctlbyname(sname, oldp, (size_t *)oldlenp, newp, (size_t)newlen); + static syctlbyname_ptr real_sysctlbyname = nullptr; + if (!real_sysctlbyname) + real_sysctlbyname = (syctlbyname_ptr)dlfunc(RTLD_NEXT, "sysctlbyname"); + if (!real_sysctlbyname) + real_sysctlbyname = (syctlbyname_ptr)dlfunc(RTLD_DEFAULT, "sysctlbyname"); + CHECK(real_sysctlbyname); + return real_sysctlbyname(sname, oldp, (size_t *)oldlenp, newp, (size_t)newlen); } #endif #endif