105 lines
3.4 KiB
Diff
105 lines
3.4 KiB
Diff
|
|
From add6d92567cfdc16e0acfaf73fb4b8cbc213661f Mon Sep 17 00:00:00 2001
|
||
|
|
From: swcompiler <lc@wxiat.com>
|
||
|
|
Date: Mon, 25 Nov 2024 17:15:16 +0800
|
||
|
|
Subject: [PATCH 16/16] libsanitizer: fix isoc23 function interception for
|
||
|
|
glibc-2.38
|
||
|
|
|
||
|
|
---
|
||
|
|
libsanitizer/asan/asan_interceptors.cpp | 55 +++++++++++++++----------
|
||
|
|
1 file changed, 33 insertions(+), 22 deletions(-)
|
||
|
|
|
||
|
|
diff --git a/libsanitizer/asan/asan_interceptors.cpp b/libsanitizer/asan/asan_interceptors.cpp
|
||
|
|
index b28909152..ae1c9bfcb 100644
|
||
|
|
--- a/libsanitizer/asan/asan_interceptors.cpp
|
||
|
|
+++ b/libsanitizer/asan/asan_interceptors.cpp
|
||
|
|
@@ -41,6 +41,8 @@
|
||
|
|
# define ASAN_PTHREAD_CREATE_VERSION "GLIBC_2.1"
|
||
|
|
# elif defined(__mips__) && SANITIZER_LINUX
|
||
|
|
# define ASAN_PTHREAD_CREATE_VERSION "GLIBC_2.2"
|
||
|
|
+# elif defined(__sw_64__)
|
||
|
|
+# define ASAN_PTHREAD_CREATE_VERSION "GLIBC_2.1"
|
||
|
|
# endif
|
||
|
|
|
||
|
|
namespace __asan {
|
||
|
|
@@ -472,19 +474,32 @@ INTERCEPTOR(char*, strncpy, char *to, const char *from, uptr size) {
|
||
|
|
return REAL(strncpy)(to, from, size);
|
||
|
|
}
|
||
|
|
|
||
|
|
-INTERCEPTOR(long, strtol, const char *nptr, char **endptr, int base) {
|
||
|
|
- void *ctx;
|
||
|
|
- ASAN_INTERCEPTOR_ENTER(ctx, strtol);
|
||
|
|
- ENSURE_ASAN_INITED();
|
||
|
|
- if (!flags()->replace_str) {
|
||
|
|
- return REAL(strtol)(nptr, endptr, base);
|
||
|
|
- }
|
||
|
|
+template <typename Fn>
|
||
|
|
+static ALWAYS_INLINE auto StrtolImpl(void *ctx, Fn real, const char *nptr,
|
||
|
|
+ char **endptr, int base)
|
||
|
|
+ -> decltype(real(nullptr, nullptr, 0)) {
|
||
|
|
+ if (!flags()->replace_str)
|
||
|
|
+ return real(nptr, endptr, base);
|
||
|
|
char *real_endptr;
|
||
|
|
- long result = REAL(strtol)(nptr, &real_endptr, base);
|
||
|
|
+ auto res = real(nptr, &real_endptr, base);
|
||
|
|
StrtolFixAndCheck(ctx, nptr, endptr, real_endptr, base);
|
||
|
|
- return result;
|
||
|
|
+ return res;
|
||
|
|
}
|
||
|
|
|
||
|
|
+# define INTERCEPTOR_STRTO_BASE(ret_type, func) \
|
||
|
|
+ INTERCEPTOR(ret_type, func, const char *nptr, char **endptr, int base) { \
|
||
|
|
+ void *ctx; \
|
||
|
|
+ ASAN_INTERCEPTOR_ENTER(ctx, func); \
|
||
|
|
+ ENSURE_ASAN_INITED(); \
|
||
|
|
+ return StrtolImpl(ctx, REAL(func), nptr, endptr, base); \
|
||
|
|
+ }
|
||
|
|
+
|
||
|
|
+INTERCEPTOR_STRTO_BASE(long, strtol)
|
||
|
|
+
|
||
|
|
+#if SANITIZER_GLIBC
|
||
|
|
+INTERCEPTOR_STRTO_BASE(long, __isoc23_strtol)
|
||
|
|
+#endif
|
||
|
|
+
|
||
|
|
INTERCEPTOR(int, atoi, const char *nptr) {
|
||
|
|
void *ctx;
|
||
|
|
ASAN_INTERCEPTOR_ENTER(ctx, atoi);
|
||
|
|
@@ -524,18 +539,11 @@ INTERCEPTOR(long, atol, const char *nptr) {
|
||
|
|
}
|
||
|
|
|
||
|
|
#if ASAN_INTERCEPT_ATOLL_AND_STRTOLL
|
||
|
|
-INTERCEPTOR(long long, strtoll, const char *nptr, char **endptr, int base) {
|
||
|
|
- void *ctx;
|
||
|
|
- ASAN_INTERCEPTOR_ENTER(ctx, strtoll);
|
||
|
|
- ENSURE_ASAN_INITED();
|
||
|
|
- if (!flags()->replace_str) {
|
||
|
|
- return REAL(strtoll)(nptr, endptr, base);
|
||
|
|
- }
|
||
|
|
- char *real_endptr;
|
||
|
|
- long long result = REAL(strtoll)(nptr, &real_endptr, base);
|
||
|
|
- StrtolFixAndCheck(ctx, nptr, endptr, real_endptr, base);
|
||
|
|
- return result;
|
||
|
|
-}
|
||
|
|
+INTERCEPTOR_STRTO_BASE(long long, strtoll)
|
||
|
|
+
|
||
|
|
+#if SANITIZER_GLIBC
|
||
|
|
+INTERCEPTOR_STRTO_BASE(long long, __isoc23_strtoll)
|
||
|
|
+#endif
|
||
|
|
|
||
|
|
INTERCEPTOR(long long, atoll, const char *nptr) {
|
||
|
|
void *ctx;
|
||
|
|
@@ -639,7 +647,10 @@ void InitializeAsanInterceptors() {
|
||
|
|
ASAN_INTERCEPT_FUNC(atoll);
|
||
|
|
ASAN_INTERCEPT_FUNC(strtoll);
|
||
|
|
#endif
|
||
|
|
-
|
||
|
|
+#if SANITIZER_GLIBC
|
||
|
|
+ ASAN_INTERCEPT_FUNC(__isoc23_strtol);
|
||
|
|
+ ASAN_INTERCEPT_FUNC(__isoc23_strtoll);
|
||
|
|
+#endif
|
||
|
|
// Intecept jump-related functions.
|
||
|
|
ASAN_INTERCEPT_FUNC(longjmp);
|
||
|
|
|
||
|
|
--
|
||
|
|
2.25.1
|
||
|
|
|