[compiler-rt] [compiler-rt] intercept macOs's freadlink call. (PR #83679)
David CARLIER via llvm-commits
llvm-commits at lists.llvm.org
Mon Sep 16 00:49:47 PDT 2024
https://github.com/devnexen updated https://github.com/llvm/llvm-project/pull/83679
>From da32a6f1654fceb869a644c65334961a8e0f45e5 Mon Sep 17 00:00:00 2001
From: David Carlier <devnexen at gmail.com>
Date: Sat, 2 Mar 2024 15:48:13 +0000
Subject: [PATCH] [compiler-rt] intercept macOs's freadlink call.
available since macOs Ventura.
---
.../sanitizer_common_interceptors.inc | 19 ++++++++++++
.../sanitizer_platform_interceptors.h | 1 +
.../TestCases/Darwin/freadlink.c | 29 +++++++++++++++++++
3 files changed, 49 insertions(+)
create mode 100644 compiler-rt/test/sanitizer_common/TestCases/Darwin/freadlink.c
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
index e09a4a8ae25fd8..30b10cc11f50aa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc
@@ -10299,6 +10299,24 @@ INTERCEPTOR(SSIZE_T, pwritev2, int fd, __sanitizer_iovec *iov, int iovcnt,
#define INIT_PWRITEV2
#endif
+#if SANITIZER_INTERCEPT_FREADLINK
+INTERCEPTOR(SSIZE_T, freadlink, int fd, char *buf, SIZE_T bufsiz) {
+ void *ctx;
+ COMMON_INTERCEPTOR_ENTER(ctx, freadlink, fd, buf, bufsiz);
+ COMMON_INTERCEPTOR_FD_ACCESS(ctx, fd);
+ SSIZE_T res = REAL(freadlink)(fd, buf, bufsiz);
+ if (res > 0)
+ COMMON_INTERCEPTOR_WRITE_RANGE(ctx, buf, res);
+ if (res >= 0 && fd > 0)
+ COMMON_INTERCEPTOR_FD_ACQUIRE(ctx, fd);
+ return res;
+}
+
+# define INIT_FREADLINK COMMON_INTERCEPT_FUNCTION(freadlink)
+#else
+# define INIT_FREADLINK
+#endif
+
#include "sanitizer_common_interceptors_netbsd_compat.inc"
namespace __sanitizer {
@@ -10620,6 +10638,7 @@ static void InitializeCommonInterceptors() {
INIT_CPUSET_GETAFFINITY;
INIT_PREADV2;
INIT_PWRITEV2;
+ INIT_FREADLINK;
INIT___PRINTF_CHK;
}
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
index 7d7ed9bc07ccfe..8721a016371109 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h
@@ -601,6 +601,7 @@
// FIXME: also available from musl 1.2.5
#define SANITIZER_INTERCEPT_PREADV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))
#define SANITIZER_INTERCEPT_PWRITEV2 (SI_LINUX && __GLIBC_PREREQ(2, 26))
+#define SANITIZER_INTERCEPT_FREADLINK SI_MAC
// This macro gives a way for downstream users to override the above
// interceptor macros irrespective of the platform they are on. They have
diff --git a/compiler-rt/test/sanitizer_common/TestCases/Darwin/freadlink.c b/compiler-rt/test/sanitizer_common/TestCases/Darwin/freadlink.c
new file mode 100644
index 00000000000000..53658cdb66aa3d
--- /dev/null
+++ b/compiler-rt/test/sanitizer_common/TestCases/Darwin/freadlink.c
@@ -0,0 +1,29 @@
+// RUN: %clang -O0 %s -o %t && %run %t
+
+#include <assert.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+int main(int argc, char **argv) {
+ char symlink_path[PATH_MAX];
+ snprintf(symlink_path, sizeof(symlink_path), "%s_%d.symlink", argv[0],
+ getpid());
+ remove(symlink_path);
+ int res = symlink(argv[0], symlink_path);
+ assert(!res);
+
+ int fd;
+ char readlink_path[PATH_MAX];
+ fd = open(symlink_path, O_RDONLY);
+ ssize_t res2 = freadlink(fd, readlink_path, sizeof(readlink_path));
+ assert(res2 >= 0);
+ readlink_path[res2] = '\0';
+ assert(!strcmp(readlink_path, argv[0]));
+ close(fd);
+
+ return 0;
+}
More information about the llvm-commits
mailing list