mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 03:56:16 +08:00
[compiler-rt][rtsan] adding setlinebuf/setbuffer interception. (#122018)
catering to platform differences as those calls are not posix.
This commit is contained in:
@@ -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) {
|
||||
@@ -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);
|
||||
|
||||
@@ -409,7 +409,7 @@ TEST_F(RtsanFileTest, SetbufDieWhenRealtime) {
|
||||
FILE *f = fopen(GetTemporaryFilePath(), "w");
|
||||
EXPECT_THAT(f, Ne(nullptr));
|
||||
|
||||
auto Func = [&f, &buffer]() { setbuf(f, buffer); };
|
||||
auto Func = [f, &buffer]() { setbuf(f, buffer); };
|
||||
|
||||
ExpectRealtimeDeath(Func, "setbuf");
|
||||
ExpectNonRealtimeSurvival(Func);
|
||||
@@ -421,7 +421,7 @@ TEST_F(RtsanFileTest, SetvbufDieWhenRealtime) {
|
||||
FILE *f = fopen(GetTemporaryFilePath(), "w");
|
||||
EXPECT_THAT(f, Ne(nullptr));
|
||||
|
||||
auto Func = [&f, &buffer, &size]() {
|
||||
auto Func = [f, &buffer, size]() {
|
||||
int r = setvbuf(f, buffer, _IOFBF, size);
|
||||
EXPECT_THAT(r, Eq(0));
|
||||
};
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user