From f6e9da08badf010d1be8fc3b24d57c7ad6c8a0cb Mon Sep 17 00:00:00 2001 From: David Carlier Date: Thu, 10 Oct 2019 11:31:37 +0000 Subject: [Sanitizers] Porting getrandom/getentropy interceptors to FreeBSD - Available from 12.x branch, by the time it lands next year in FreeBSD tree, the 11.x's might be EOL. - Intentionally changed the getrandom test to C code as with 12.0 (might be fixed in CURRENT since), there is a linkage issue in C++ context. Reviewers: emaste, dim, vitalybuka Reviewed-By: vitalybuka Differential Revision: https://reviews.llvm.org/D68451 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@374315 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../sanitizer_common_interceptors.inc | 16 +++++++++++++ .../sanitizer_platform_interceptors.h | 3 ++- .../sanitizer_common/TestCases/Linux/getrandom.cpp | 22 ------------------ test/sanitizer_common/TestCases/Posix/getrandom.c | 26 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 23 deletions(-) delete mode 100644 test/sanitizer_common/TestCases/Linux/getrandom.cpp create mode 100644 test/sanitizer_common/TestCases/Posix/getrandom.c diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 7cae94559..50e3558b5 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -9608,6 +9608,21 @@ INTERCEPTOR(char *, crypt_r, char *key, char *salt, void *data) { #define INIT_CRYPT_R #endif +#if SANITIZER_INTERCEPT_GETENTROPY +INTERCEPTOR(int, getentropy, void *buf, SIZE_T buflen) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, getentropy, buf, buflen); + int r = REAL(getentropy)(buf, buflen); + if (r == 0) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, buflen); + } + return r; +} +#define INIT_GETENTROPY COMMON_INTERCEPT_FUNCTION(getentropy) +#else +#define INIT_GETENTROPY +#endif + static void InitializeCommonInterceptors() { #if SI_POSIX static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1]; @@ -9908,6 +9923,7 @@ static void InitializeCommonInterceptors() { INIT_GETRANDOM; INIT_CRYPT; INIT_CRYPT_R; + INIT_GETENTROPY; INIT___PRINTF_CHK; } diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 54a1699f5..4aeecf120 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -569,9 +569,10 @@ #define SANITIZER_INTERCEPT_CRYPT (SI_POSIX && !SI_ANDROID) #define SANITIZER_INTERCEPT_CRYPT_R (SI_LINUX && !SI_ANDROID) -#define SANITIZER_INTERCEPT_GETRANDOM (SI_LINUX && __GLIBC_PREREQ(2, 25)) +#define SANITIZER_INTERCEPT_GETRANDOM ((SI_LINUX && __GLIBC_PREREQ(2, 25)) || SI_FREEBSD) #define SANITIZER_INTERCEPT___CXA_ATEXIT SI_NETBSD #define SANITIZER_INTERCEPT_ATEXIT SI_NETBSD #define SANITIZER_INTERCEPT_PTHREAD_ATFORK SI_NETBSD +#define SANITIZER_INTERCEPT_GETENTROPY SI_FREEBSD #endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H diff --git a/test/sanitizer_common/TestCases/Linux/getrandom.cpp b/test/sanitizer_common/TestCases/Linux/getrandom.cpp deleted file mode 100644 index 08337f537..000000000 --- a/test/sanitizer_common/TestCases/Linux/getrandom.cpp +++ /dev/null @@ -1,22 +0,0 @@ -// RUN: %clangxx -O2 %s -o %t && %run %t -// UNSUPPORTED: android -// - -#include - -#if !defined(__GLIBC_PREREQ) -#define __GLIBC_PREREQ(a, b) 0 -#endif - -#if __GLIBC_PREREQ(2, 25) -#include -#endif - -int main() { - char buf[16]; - ssize_t n = 1; -#if __GLIBC_PREREQ(2, 25) - n = getrandom(buf, sizeof(buf), 0); -#endif - return (int)(n <= 0); -} diff --git a/test/sanitizer_common/TestCases/Posix/getrandom.c b/test/sanitizer_common/TestCases/Posix/getrandom.c new file mode 100644 index 000000000..fdc08bc4e --- /dev/null +++ b/test/sanitizer_common/TestCases/Posix/getrandom.c @@ -0,0 +1,26 @@ +// RUN: %clang -O2 %s -o %t && %run %t +// UNSUPPORTED: android netbsd darwin solaris +// + +#include + +#if !defined(__GLIBC_PREREQ) +#define __GLIBC_PREREQ(a, b) 0 +#endif + +#if (defined(__linux__) && __GLIBC_PREREQ(2, 25)) || defined(__FreeBSD__) +#define HAS_GETRANDOM +#endif + +#if defined(HAS_GETRANDOM) +#include +#endif + +int main() { + char buf[16]; + ssize_t n = 1; +#if defined(HAS_GETRANDOM) + n = getrandom(buf, sizeof(buf), 0); +#endif + return (int)(n <= 0); +} -- cgit v1.2.1