[Sanitizer] Add interceptor for wcsdup
Summary: The wide-string equivalent of strdup. Implementation trivial. Reviewers: vitalybuka, eugenis Subscribers: kubamracek, delcypher, llvm-commits, #sanitizers Tags: #llvm, #sanitizers Differential Revision: https://reviews.llvm.org/D62189 llvm-svn: 361357
This commit is contained in:
parent
df00c6a54f
commit
269340f1cf
|
|
@ -6734,6 +6734,23 @@ INTERCEPTOR(wchar_t *, wcsncat, wchar_t *dst, const wchar_t *src, SIZE_T n) {
|
|||
#define INIT_WCSCAT
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_WCSDUP
|
||||
INTERCEPTOR(wchar_t *, wcsdup, wchar_t *s) {
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, wcsdup, s);
|
||||
SIZE_T len = REAL(wcslen)(s);
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, s, sizeof(wchar_t) * (len + 1));
|
||||
wchar_t *result = REAL(wcsdup)(s);
|
||||
if (result)
|
||||
COMMON_INTERCEPTOR_WRITE_RANGE(ctx, result, sizeof(wchar_t) * (len + 1));
|
||||
return result;
|
||||
}
|
||||
|
||||
#define INIT_WCSDUP COMMON_INTERCEPT_FUNCTION(wcsdup);
|
||||
#else
|
||||
#define INIT_WCSDUP
|
||||
#endif
|
||||
|
||||
#if SANITIZER_INTERCEPT_STRXFRM
|
||||
static SIZE_T RealStrLen(const char *str) { return REAL(strlen)(str); }
|
||||
|
||||
|
|
@ -9765,6 +9782,7 @@ static void InitializeCommonInterceptors() {
|
|||
INIT_GETLOADAVG;
|
||||
INIT_WCSLEN;
|
||||
INIT_WCSCAT;
|
||||
INIT_WCSDUP;
|
||||
INIT_WCSXFRM;
|
||||
INIT___WCSXFRM_L;
|
||||
INIT_ACCT;
|
||||
|
|
|
|||
|
|
@ -492,6 +492,7 @@
|
|||
#define SANITIZER_INTERCEPT_MALLOC_USABLE_SIZE (!SI_MAC && !SI_OPENBSD)
|
||||
#define SANITIZER_INTERCEPT_MCHECK_MPROBE SI_LINUX_NOT_ANDROID
|
||||
#define SANITIZER_INTERCEPT_WCSCAT SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_WCSDUP SI_POSIX
|
||||
#define SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION (!SI_WINDOWS && SI_NOT_FUCHSIA)
|
||||
#define SANITIZER_INTERCEPT_BSD_SIGNAL SI_ANDROID
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
// RUN: %clang %s -o %t && %run %t 2>&1
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <wchar.h>
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
wchar_t *buff = wcsdup(L"foo");
|
||||
assert(buff[0] == L'f');
|
||||
assert(buff[1] == L'o');
|
||||
assert(buff[2] == L'o');
|
||||
assert(buff[3] == L'\0');
|
||||
free(buff);
|
||||
return 0;
|
||||
}
|
||||
Loading…
Reference in New Issue