[compiler-rt] f39ecb7 - [compiler][rtsan] stream based on memory buffer interception. (#120672)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 20 09:29:33 PST 2024
Author: David CARLIER
Date: 2024-12-20T17:29:30Z
New Revision: f39ecb7b2846af1c113ec50bc4e1f204d18e7d90
URL: https://github.com/llvm/llvm-project/commit/f39ecb7b2846af1c113ec50bc4e1f204d18e7d90
DIFF: https://github.com/llvm/llvm-project/commit/f39ecb7b2846af1c113ec50bc4e1f204d18e7d90.diff
LOG: [compiler][rtsan] stream based on memory buffer interception. (#120672)
Added:
Modified:
compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
index 24e0857b966506..4e51f464b57304 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
@@ -297,6 +297,23 @@ INTERCEPTOR(FILE *, fdopen, int fd, const char *mode) {
return REAL(fdopen)(fd, mode);
}
+#if SANITIZER_INTERCEPT_OPEN_MEMSTREAM
+INTERCEPTOR(FILE *, open_memstream, char **buf, size_t *size) {
+ __rtsan_notify_intercepted_call("open_memstream");
+ return REAL(open_memstream)(buf, size);
+}
+
+INTERCEPTOR(FILE *, fmemopen, void *buf, size_t size, const char *mode) {
+ __rtsan_notify_intercepted_call("fmemopen");
+ return REAL(fmemopen)(buf, size, mode);
+}
+#define RTSAN_MAYBE_INTERCEPT_OPEN_MEMSTREAM INTERCEPT_FUNCTION(open_memstream)
+#define RTSAN_MAYBE_INTERCEPT_FMEMOPEN INTERCEPT_FUNCTION(fmemopen)
+#else
+#define RTSAN_MAYBE_INTERCEPT_OPEN_MEMSTREAM
+#define RTSAN_MAYBE_INTERCEPT_FMEMOPEN
+#endif
+
INTERCEPTOR(int, puts, const char *s) {
__rtsan_notify_intercepted_call("puts");
return REAL(puts)(s);
@@ -955,6 +972,8 @@ void __rtsan::InitializeInterceptors() {
INTERCEPT_FUNCTION(fputs);
INTERCEPT_FUNCTION(fdopen);
INTERCEPT_FUNCTION(freopen);
+ RTSAN_MAYBE_INTERCEPT_OPEN_MEMSTREAM;
+ RTSAN_MAYBE_INTERCEPT_FMEMOPEN;
INTERCEPT_FUNCTION(lseek);
RTSAN_MAYBE_INTERCEPT_LSEEK64;
INTERCEPT_FUNCTION(dup);
diff --git a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
index 5859ec7b5fb61b..eb502e99bb1b5e 100644
--- a/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
+++ b/compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
@@ -353,6 +353,31 @@ TEST_F(RtsanFileTest, FopenDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
+#if SANITIZER_INTERCEPT_OPEN_MEMSTREAM
+TEST_F(RtsanFileTest, OpenMemstreamDiesWhenRealtime) {
+ char *buffer;
+ size_t size;
+ auto Func = [&buffer, &size]() {
+ FILE *f = open_memstream(&buffer, &size);
+ EXPECT_THAT(f, Ne(nullptr));
+ };
+
+ ExpectRealtimeDeath(Func, "open_memstream");
+ ExpectNonRealtimeSurvival(Func);
+}
+
+TEST_F(RtsanFileTest, FmemOpenDiesWhenRealtime) {
+ char buffer[1024];
+ auto Func = [&buffer]() {
+ FILE *f = fmemopen(&buffer, sizeof(buffer), "w");
+ EXPECT_THAT(f, Ne(nullptr));
+ };
+
+ ExpectRealtimeDeath(Func, "fmemopen");
+ ExpectNonRealtimeSurvival(Func);
+}
+#endif
+
class RtsanOpenedFileTest : public RtsanFileTest {
protected:
void SetUp() override {
More information about the llvm-commits
mailing list