diff options
author | David Carlier <devnexen@gmail.com> | 2019-01-08 21:49:37 +0000 |
---|---|---|
committer | David Carlier <devnexen@gmail.com> | 2019-01-08 21:49:37 +0000 |
commit | 351a847ce1d5c37a0405607b0ee004bd124d6eab (patch) | |
tree | 552a3d3538619384068199e17f22f621f93e2ab6 /compiler-rt | |
parent | a74266858a8164cfb23d4e138cd4c7c37be0b5d1 (diff) |
[Sanitizer] Intercept fdevname on FreeBSD
- Is a file descriptor flavor FreeBSD's specific.
- reentrant version included.
Reviewers: vitalybuka, krytarowski, emaste
Reviewed By: emaste
Differential Revision: https://reviews.llvm.org/D56268
Diffstat (limited to 'compiler-rt')
3 files changed, 80 insertions, 0 deletions
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc index 1599c578938..11238971cf1 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -9347,6 +9347,40 @@ INTERCEPTOR(__sanitizer_FILE *, funopen2, void *cookie, funopen2_readfn readfn, #define INIT_FUNOPEN2 #endif +#if SANITIZER_INTERCEPT_FDEVNAME +INTERCEPTOR(char *, fdevname, int fd) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, fdevname, fd); + COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd); + char *name = REAL(fdevname)(fd); + if (name) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, name, REAL(strlen)(name) + 1); + if (fd > 0) + COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); + } + return name; +} + +INTERCEPTOR(char *, fdevname_r, int fd, char *buf, SIZE_T len) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, fdevname_r, fd, buf, len); + COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd); + char *name = REAL(fdevname_r)(fd, buf, len); + if (name && buf && len > 0) { + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, REAL(strlen)(buf) + 1); + if (fd > 0) + COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd); + } + return name; +} + +#define INIT_FDEVNAME \ + COMMON_INTERCEPT_FUNCTION(fdevname); \ + COMMON_INTERCEPT_FUNCTION(fdevname_r); +#else +#define INIT_FDEVNAME +#endif + static void InitializeCommonInterceptors() { static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1]; interceptor_metadata_map = @@ -9634,6 +9668,7 @@ static void InitializeCommonInterceptors() { INIT_PCLOSE; INIT_FUNOPEN; INIT_FUNOPEN2; + INIT_FDEVNAME; INIT___PRINTF_CHK; } diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h index c27a62e7623..da51d474100 100644 --- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -547,6 +547,7 @@ #define SANITIZER_INTERCEPT_VIS (SI_NETBSD || SI_FREEBSD) #define SANITIZER_INTERCEPT_GETFSENT (SI_FREEBSD || SI_NETBSD || SI_MAC) #define SANITIZER_INTERCEPT_ARC4RANDOM (SI_FREEBSD || SI_NETBSD) +#define SANITIZER_INTERCEPT_FDEVNAME SI_FREEBSD #define SANITIZER_INTERCEPT_POPEN SI_POSIX #define SANITIZER_INTERCEPT_POPENVE SI_NETBSD diff --git a/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc new file mode 100644 index 00000000000..252335e9afb --- /dev/null +++ b/compiler-rt/test/sanitizer_common/TestCases/FreeBSD/fdevname.cc @@ -0,0 +1,44 @@ +// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s + +#include <assert.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <sys/stat.h> + +void test_fdevname() { + int fd = open("/dev/null", O_RDONLY); + char *name; + + printf("test_fdevname\n"); + assert(fd != -1); + assert((name = fdevname(fd))); + close(fd); + + printf("%s\n", name); +} + +void test_fdevname_r() { + int fd = open("/dev/null", O_RDONLY); + char *name; + char buf[5]; + + printf("test_fdevname_r\n"); + assert(fd != -1); + assert((name = fdevname_r(fd, buf, sizeof(buf)))); + close(fd); + + printf("%s\n", name); +} + +int main(void) { + test_fdevname(); + test_fdevname_r(); + // CHECK: test_fdevname + // CHECK: null + // CHECK: test_fdevname_r + // CHECK: null + + return 0; +} |