summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_common_interceptors.inc
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2018-03-07 00:14:12 +0000
committerVitaly Buka <vitalybuka@google.com>2018-03-07 00:14:12 +0000
commit4f09499dc766ec4ce5170f4553a6951a5e063c29 (patch)
tree67c3bdde752c312b2550396c93d6bbb82edb048a /lib/sanitizer_common/sanitizer_common_interceptors.inc
parent03e114b188efa25ce9371cd4c1e212477e0981d3 (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.inc36
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;