diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-18 13:35:13 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-18 13:35:13 +0000 |
commit | 6b16869bba26cf446cac97a9fadc960aa6360b34 (patch) | |
tree | 05ba18ec70b488e7b57ae6ff39f5154442756955 | |
parent | 55efb03eed0b37bc415cc1a56341b45d16e44cb7 (diff) | |
download | compiler-rt-6b16869bba26cf446cac97a9fadc960aa6360b34.tar.gz |
[msan] Intercept __getdelim.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@211162 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 15 | ||||
-rw-r--r-- | test/msan/getline.cc | 5 |
2 files changed, 15 insertions, 5 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index ef005f1a9..e73431c09 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -3647,14 +3647,14 @@ INTERCEPTOR(SSIZE_T, getline, char **lineptr, SIZE_T *n, void *stream) { } return res; } -INTERCEPTOR(SSIZE_T, getdelim, char **lineptr, SIZE_T *n, int delim, +INTERCEPTOR(SSIZE_T, __getdelim, char **lineptr, SIZE_T *n, int delim, void *stream) { void *ctx; - COMMON_INTERCEPTOR_ENTER(ctx, getdelim, lineptr, n, delim, stream); + COMMON_INTERCEPTOR_ENTER(ctx, __getdelim, lineptr, n, delim, stream); // FIXME: under ASan the call below may write to freed memory and corrupt // its metadata. See // https://code.google.com/p/address-sanitizer/issues/detail?id=321. - SSIZE_T res = REAL(getdelim)(lineptr, n, delim, stream); + SSIZE_T res = REAL(__getdelim)(lineptr, n, delim, stream); if (res > 0) { COMMON_INTERCEPTOR_WRITE_RANGE(ctx, lineptr, sizeof(*lineptr)); COMMON_INTERCEPTOR_WRITE_RANGE(ctx, n, sizeof(*n)); @@ -3662,8 +3662,13 @@ INTERCEPTOR(SSIZE_T, getdelim, char **lineptr, SIZE_T *n, int delim, } return res; } -#define INIT_GETLINE \ - COMMON_INTERCEPT_FUNCTION(getline); \ +INTERCEPTOR(SSIZE_T, getdelim, char **lineptr, SIZE_T *n, int delim, + void *stream) { + return __getdelim(lineptr, n, delim, stream); +} +#define INIT_GETLINE \ + COMMON_INTERCEPT_FUNCTION(getline); \ + COMMON_INTERCEPT_FUNCTION(__getdelim); \ COMMON_INTERCEPT_FUNCTION(getdelim); #else #define INIT_GETLINE diff --git a/test/msan/getline.cc b/test/msan/getline.cc index 086d0b951..d0ab81a39 100644 --- a/test/msan/getline.cc +++ b/test/msan/getline.cc @@ -1,4 +1,9 @@ // RUN: %clangxx_msan -O0 %s -o %t && %run %t %p +// RUN: %clangxx_msan -O2 %s -o %t && %run %t %p +// RUN: %clang_msan -O0 -xc %s -o %t && %run %t %p +// RUN: %clang_msan -O2 -xc %s -o %t && %run %t %p +// RUN: %clang_msan -O0 -xc -D_GNU_SOURCE=1 %s -o %t && %run %t %p +// RUN: %clang_msan -O2 -xc -D_GNU_SOURCE=1 %s -o %t && %run %t %p #include <assert.h> #include <stdio.h> |