[compiler-rt] Implement getrandom interception

Summary:
Straightforward implementation of `getrandom` syscall and libc
hooks.

Test Plan: Local MSAN failures caused by uninstrumented `getrandom`
calls stop failing.

Patch by Andrew Krieger.

Reviewers: eugenis, vitalybuka

Reviewed By: vitalybuka

Subscribers: srhines, kubamracek, dberris, #sanitizers, llvm-commits

Tags: #sanitizers, #llvm

Differential Revision: https://reviews.llvm.org/D65551

llvm-svn: 367999
This commit is contained in:
Vitaly Buka 2019-08-06 08:41:53 +00:00
parent dba4dd1e8d
commit ac9ee01fcb
4 changed files with 52 additions and 0 deletions

View File

@ -9550,6 +9550,21 @@ INTERCEPTOR(void, sl_free, void *sl, int freeall) {
#define INIT_SL_INIT
#endif
#if SANITIZER_INTERCEPT_GETRANDOM
INTERCEPTOR(SSIZE_T, getrandom, void *buf, SIZE_T buflen, unsigned int flags) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, getrandom, buf, buflen, flags);
SSIZE_T n = REAL(getrandom)(buf, buflen, flags);
if (n > 0) {
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, n);
}
return n;
}
#define INIT_GETRANDOM COMMON_INTERCEPT_FUNCTION(getrandom)
#else
#define INIT_GETRANDOM
#endif
static void InitializeCommonInterceptors() {
#if SI_POSIX
static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1];
@ -9848,6 +9863,7 @@ static void InitializeCommonInterceptors() {
INIT_FDEVNAME;
INIT_GETUSERSHELL;
INIT_SL_INIT;
INIT_GETRANDOM;
INIT___PRINTF_CHK;
}

View File

@ -2873,6 +2873,18 @@ POST_SYSCALL(rt_sigaction)(long res, long signum,
POST_WRITE(oldact, oldact_sz);
}
}
PRE_SYSCALL(getrandom)(void *buf, uptr count, long flags) {
if (buf) {
PRE_WRITE(buf, count);
}
}
POST_SYSCALL(getrandom)(long res, void *buf, uptr count, long flags) {
if (res > 0 && buf) {
POST_WRITE(buf, res);
}
}
} // extern "C"
#undef PRE_SYSCALL

View File

@ -566,4 +566,6 @@
#define SANITIZER_INTERCEPT_GETUSERSHELL (SI_POSIX && !SI_POSIX)
#define SANITIZER_INTERCEPT_SL_INIT (SI_FREEBSD || SI_NETBSD)
#define SANITIZER_INTERCEPT_GETRANDOM SI_LINUX
#endif // #ifndef SANITIZER_PLATFORM_INTERCEPTORS_H

View File

@ -0,0 +1,22 @@
// RUN: %clangxx -O2 %s -o %t && %run %t
// UNSUPPORTED: android
//
#include <sys/types.h>
#if !defined(__GLIBC_PREREQ)
#define __GLIBC_PREREQ(a, b) 0
#endif
#if __GLIBC_PREREQ(2, 25)
#include <sys/random.h>
#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);
}