Skip to content

Commit

Permalink
[compiler-rt][rtsan] adding setlinebuf/setbuffer interception.
Browse files Browse the repository at this point in the history
catering to platform differences as those calls are not posix.
  • Loading branch information
devnexen committed Jan 7, 2025
1 parent c6f67b8 commit ff67827
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 0 deletions.
24 changes: 24 additions & 0 deletions compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -347,11 +347,33 @@ INTERCEPTOR(int, setvbuf, FILE *stream, char *buf, int mode, size_t size) {
__rtsan_notify_intercepted_call("setvbuf");
return REAL(setvbuf)(stream, buf, mode, size);
}

# if SANITIZER_LINUX
INTERCEPTOR(void, setlinebuf, FILE *stream) {
# else
INTERCEPTOR(int, setlinebuf, FILE *stream) {
# endif
__rtsan_notify_intercepted_call("setlinebuf");
return REAL(setlinebuf)(stream);
}

# if SANITIZER_LINUX
INTERCEPTOR(void, setbuffer, FILE *stream, char *buf, size_t size) {
# else
INTERCEPTOR(void, setbuffer, FILE *stream, char *buf, int size) {
# endif
__rtsan_notify_intercepted_call("setbuffer");
return REAL(setbuffer)(stream, buf, size);
}
#define RTSAN_MAYBE_INTERCEPT_SETBUF INTERCEPT_FUNCTION(setbuf)
#define RTSAN_MAYBE_INTERCEPT_SETVBUF INTERCEPT_FUNCTION(setvbuf)
#define RTSAN_MAYBE_INTERCEPT_SETLINEBUF INTERCEPT_FUNCTION(setlinebuf)
#define RTSAN_MAYBE_INTERCEPT_SETBUFFER INTERCEPT_FUNCTION(setbuffer)
#else
#define RTSAN_MAYBE_INTERCEPT_SETBUF
#define RTSAN_MAYBE_INTERCEPT_SETVBUF
#define RTSAN_MAYBE_INTERCEPT_SETLINEBUF
#define RTSAN_MAYBE_INTERCEPT_SETBUFFER
#endif

INTERCEPTOR(int, puts, const char *s) {
Expand Down Expand Up @@ -1018,6 +1040,8 @@ void __rtsan::InitializeInterceptors() {
RTSAN_MAYBE_INTERCEPT_FMEMOPEN;
RTSAN_MAYBE_INTERCEPT_SETBUF;
RTSAN_MAYBE_INTERCEPT_SETVBUF;
RTSAN_MAYBE_INTERCEPT_SETLINEBUF;
RTSAN_MAYBE_INTERCEPT_SETBUFFER;
INTERCEPT_FUNCTION(lseek);
RTSAN_MAYBE_INTERCEPT_LSEEK64;
INTERCEPT_FUNCTION(dup);
Expand Down
22 changes: 22 additions & 0 deletions compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,28 @@ TEST_F(RtsanFileTest, SetvbufDieWhenRealtime) {
ExpectRealtimeDeath(Func, "setvbuf");
ExpectNonRealtimeSurvival(Func);
}

TEST_F(RtsanFileTest, SetlinebufDieWhenRealtime) {
FILE *f = fopen(GetTemporaryFilePath(), "w");
EXPECT_THAT(f, Ne(nullptr));

auto Func = [&f]() { setlinebuf(f); };

ExpectRealtimeDeath(Func, "setlinebuf");
ExpectNonRealtimeSurvival(Func);
}

TEST_F(RtsanFileTest, SetbufferDieWhenRealtime) {
char buffer[1024];
size_t size = sizeof(buffer);
FILE *f = fopen(GetTemporaryFilePath(), "w");
EXPECT_THAT(f, Ne(nullptr));

auto Func = [&f, &buffer, &size]() { setbuffer(f, buffer, size); };

ExpectRealtimeDeath(Func, "setbuffer");
ExpectNonRealtimeSurvival(Func);
}
#endif

class RtsanOpenedFileTest : public RtsanFileTest {
Expand Down

0 comments on commit ff67827

Please sign in to comment.