diff options
author | David Carlier <devnexen@gmail.com> | 2019-01-11 05:53:09 +0000 |
---|---|---|
committer | David Carlier <devnexen@gmail.com> | 2019-01-11 05:53:09 +0000 |
commit | 969bbb9cd5bc1401df9878af4fce201d1e928387 (patch) | |
tree | b5e208636f1f1628d2ed7fb570b8a254139dabbd | |
parent | da0fc92a812844d3332789a407ec74131026f7e1 (diff) | |
download | compiler-rt-969bbb9cd5bc1401df9878af4fce201d1e928387.tar.gz |
[Sanitizer] Intercept getusershell
- If entries are properly copied (there were a bug in FreeBSD implementation in earlier version), or list properly reset.
Reviewers: vitalybuka, krytarowski
Reviewed By: krytarowski
Differential Revision: https://reviews.llvm.org/D56562
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@350919 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 16 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_interceptors.h | 1 | ||||
-rw-r--r-- | test/sanitizer_common/TestCases/Posix/getusershell.cc | 21 |
3 files changed, 38 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 252f55552..f3ea863bd 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -9399,6 +9399,21 @@ INTERCEPTOR(char *, fdevname_r, int fd, char *buf, SIZE_T len) { #define INIT_FDEVNAME #endif +#if SANITIZER_INTERCEPT_GETUSERSHELL +INTERCEPTOR(char *, getusershell) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, getusershell); + char *res = REAL(getusershell)(); + if (res) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1); + return res; +} + +#define INIT_GETUSERSHELL COMMON_INTERCEPT_FUNCTION(getusershell); +#else +#define INIT_GETUSERSHELL +#endif + static void InitializeCommonInterceptors() { static u64 metadata_mem[sizeof(MetadataHashMap) / sizeof(u64) + 1]; interceptor_metadata_map = @@ -9687,6 +9702,7 @@ static void InitializeCommonInterceptors() { INIT_FUNOPEN; INIT_FUNOPEN2; INIT_FDEVNAME; + INIT_GETUSERSHELL; INIT___PRINTF_CHK; } diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index da51d4741..96fb0b84e 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -548,6 +548,7 @@ #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_GETUSERSHELL SI_POSIX #define SANITIZER_INTERCEPT_POPEN SI_POSIX #define SANITIZER_INTERCEPT_POPENVE SI_NETBSD diff --git a/test/sanitizer_common/TestCases/Posix/getusershell.cc b/test/sanitizer_common/TestCases/Posix/getusershell.cc new file mode 100644 index 000000000..6ad1c5bd1 --- /dev/null +++ b/test/sanitizer_common/TestCases/Posix/getusershell.cc @@ -0,0 +1,21 @@ +// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s + +#include <assert.h> +#include <errno.h> +#include <stdio.h> +#include <unistd.h> + +int main(void) { + printf("getusershell\n"); + + setusershell(); + char *fentry = getusershell(); + + printf("First entry: '%s'\n", fentry); + + endusershell(); + + return 0; + // CHECK: getusershell + // CHECK: First entry: '{{.*}}' +} |