[compiler-rt] faef0d0 - Problem with realpath interceptor
Dmitry Vyukov via llvm-commits
llvm-commits at lists.llvm.org
Tue Aug 10 07:29:47 PDT 2021
Author: Dmitry Vyukov
Date: 2021-08-10T16:29:42+02:00
New Revision: faef0d042f523357fe5590e7cb6a8391cf0351a8
URL: https://github.com/llvm/llvm-project/commit/faef0d042f523357fe5590e7cb6a8391cf0351a8
DIFF: https://github.com/llvm/llvm-project/commit/faef0d042f523357fe5590e7cb6a8391cf0351a8.diff
LOG: Problem with realpath interceptor
tsan in some cases (e.g. after fork from multithreaded program, which arguably is problematic) increments ignore_interceptors and in that case runs just the intercepted functions and not their wrappers.
For realpath the interceptor handles the resolved_path == nullptr case though and so when ignore_interceptors is non-zero, realpath (".", nullptr) will fail instead of succeeding.
This patch uses instead the COMMON_INTERCEPT_FUNCTION_GLIBC_VER_MIN macro to use realpath@@GLIBC_2.3 whenever possible (if not, then it is likely a glibc architecture
with more recent oldest symbol version than 2.3, for which any realpath in glibc will DTRT, or unsupported glibc older than 2.3), which never supported NULL as second argument.
Reviewed By: dvyukov
Differential Revision: https://reviews.llvm.org/D107819
Added:
Modified:
compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
Removed:
################################################################################
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index 5681d8a3404d1..b970655944883 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -3664,21 +3664,11 @@ INTERCEPTOR(char *, realpath, const char *path, char *resolved_path) {
void *ctx;
COMMON_INTERCEPTOR_ENTER(ctx, realpath, path, resolved_path);
if (path) COMMON_INTERCEPTOR_READ_RANGE(ctx, path, REAL(strlen)(path) + 1);
-
- // Workaround a bug in glibc where dlsym(RTLD_NEXT, ...) returns the oldest
- // version of a versioned symbol. For realpath(), this gives us something
- // (called __old_realpath) that does not handle NULL in the second argument.
- // Handle it as part of the interceptor.
- char *allocated_path = nullptr;
- if (!resolved_path)
- allocated_path = resolved_path = (char *)WRAP(malloc)(path_max + 1);
-
char *res = REAL(realpath)(path, resolved_path);
- if (allocated_path && !res) WRAP(free)(allocated_path);
if (res) COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
return res;
}
-#define INIT_REALPATH COMMON_INTERCEPT_FUNCTION(realpath);
+#define INIT_REALPATH COMMON_INTERCEPT_FUNCTION_GLIBC_VER_MIN(realpath, "GLIBC_2.3");
#else
#define INIT_REALPATH
#endif
More information about the llvm-commits
mailing list