[compiler-rt] Add internal wcslen to avoid crashing on windows 64-bits
Summary: The function wcslen is incorrectly hooked on windows 64-bits. The interception library is not able to hook without breaking the code. The function is too small and the interception must be done with trampoline-hooking which turned out to be incorrect on a small loop (first few instructions have a backedge). Reviewers: rnk Subscribers: wang0109, chrisha, llvm-commits, kubabrecka Differential Revision: https://reviews.llvm.org/D22363 llvm-svn: 275488
This commit is contained in:
parent
f203ab5be3
commit
7903382468
|
@ -585,7 +585,12 @@ INTERCEPTOR(char*, __strdup, const char *s) {
|
|||
INTERCEPTOR(SIZE_T, wcslen, const wchar_t *s) {
|
||||
void *ctx;
|
||||
ASAN_INTERCEPTOR_ENTER(ctx, wcslen);
|
||||
#if SANITIZER_WINDOWS64
|
||||
// The function is incorrectly hooked on windows 64-bit.
|
||||
SIZE_T length = internal_wcslen(s);
|
||||
#else
|
||||
SIZE_T length = REAL(wcslen)(s);
|
||||
#endif
|
||||
if (!asan_init_is_running) {
|
||||
ENSURE_ASAN_INITED();
|
||||
ASAN_READ_RANGE(ctx, s, (length + 1) * sizeof(wchar_t));
|
||||
|
|
|
@ -234,6 +234,12 @@ char *internal_strstr(const char *haystack, const char *needle) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
uptr internal_wcslen(const wchar_t *s) {
|
||||
uptr i = 0;
|
||||
while (s[i]) i++;
|
||||
return i;
|
||||
}
|
||||
|
||||
s64 internal_simple_strtoll(const char *nptr, char **endptr, int base) {
|
||||
CHECK_EQ(base, 10);
|
||||
while (IsSpace(*nptr)) nptr++;
|
||||
|
|
|
@ -51,6 +51,7 @@ char *internal_strncpy(char *dst, const char *src, uptr n);
|
|||
uptr internal_strnlen(const char *s, uptr maxlen);
|
||||
char *internal_strrchr(const char *s, int c);
|
||||
// This is O(N^2), but we are not using it in hot places.
|
||||
uptr internal_wcslen(const wchar_t *s);
|
||||
char *internal_strstr(const char *haystack, const char *needle);
|
||||
// Works only for base=10 and doesn't set errno.
|
||||
s64 internal_simple_strtoll(const char *nptr, char **endptr, int base);
|
||||
|
|
Loading…
Reference in New Issue