diff options
author | Vitaly Buka <vitalybuka@google.com> | 2018-03-07 00:14:12 +0000 |
---|---|---|
committer | Vitaly Buka <vitalybuka@google.com> | 2018-03-07 00:14:12 +0000 |
commit | 4f09499dc766ec4ce5170f4553a6951a5e063c29 (patch) | |
tree | 67c3bdde752c312b2550396c93d6bbb82edb048a /lib/sanitizer_common/sanitizer_common_interceptors.inc | |
parent | 03e114b188efa25ce9371cd4c1e212477e0981d3 (diff) |
[sanitizer] Add interceptors for wcsxfrm, wcsxfrm_l
Patch by Oliver Chang
Reviewers: vitalybuka
Reviewed By: vitalybuka
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D44133
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@326852 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_common_interceptors.inc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index eddc54e6f..6df0971e0 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -6529,6 +6529,41 @@ INTERCEPTOR(wchar_t *, wcsncat, wchar_t *dst, const wchar_t *src, SIZE_T n) { #define INIT_WCSCAT #endif +#if SANITIZER_INTERCEPT_WCSXFRM +INTERCEPTOR(SIZE_T, wcsxfrm, wchar_t *dest, const wchar_t *src, SIZE_T len) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, wcsxfrm, dest, src, len); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); + + SIZE_T res = REAL(wcsxfrm)(dest, src, len); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(wchar_t) * (res + 1)); + + return res; +} + +INTERCEPTOR(SIZE_T, wcsxfrm_l, wchar_t *dest, const wchar_t *src, SIZE_T len, + void *locale) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, wcsxfrm_l, dest, src, len, locale); + COMMON_INTERCEPTOR_READ_RANGE(ctx, src, + sizeof(wchar_t) * (REAL(wcslen)(src) + 1)); + + SIZE_T res = REAL(wcsxfrm_l)(dest, src, len, locale); + if (res < len) + COMMON_INTERCEPTOR_WRITE_RANGE(ctx, dest, sizeof(wchar_t) * (res + 1)); + + return res; +} + +#define INIT_WCSXFRM \ + COMMON_INTERCEPT_FUNCTION(wcsxfrm); \ + COMMON_INTERCEPT_FUNCTION(wcsxfrm_l); +#else +#define INIT_WCSXFRM +#endif + #if SANITIZER_INTERCEPT_ACCT INTERCEPTOR(int, acct, const char *file) { void *ctx; @@ -7275,6 +7310,7 @@ static void InitializeCommonInterceptors() { INIT_GETLOADAVG; INIT_WCSLEN; INIT_WCSCAT; + INIT_WCSXFRM; INIT_ACCT; INIT_USER_FROM_UID; INIT_UID_FROM_USER; |