Skip to content

Commit 95db111

Browse files
authored
[compiler-rt][rtsan] intercept setbuf, setvbuf, setlinebuf and setbuffer (#121616)
1 parent 2529a8d commit 95db111

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

compiler-rt/lib/rtsan/rtsan_interceptors_posix.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,37 @@ INTERCEPTOR(FILE *, fmemopen, void *buf, size_t size, const char *mode) {
325325
#define RTSAN_MAYBE_INTERCEPT_FMEMOPEN
326326
#endif
327327

328+
#if SANITIZER_INTERCEPT_SETVBUF
329+
INTERCEPTOR(void, setbuf, FILE *stream, char *buf) {
330+
__rtsan_notify_intercepted_call("setbuf");
331+
return REAL(setbuf)(stream, buf);
332+
}
333+
334+
INTERCEPTOR(void, setbuffer, FILE *stream, char *buf, size_t size) {
335+
__rtsan_notify_intercepted_call("setbuffer");
336+
return REAL(setbuffer)(stream, buf, size);
337+
}
338+
339+
INTERCEPTOR(void, setlinebuf, FILE *stream) {
340+
__rtsan_notify_intercepted_call("setlinebuf");
341+
return REAL(setlinebuf)(stream);
342+
}
343+
344+
INTERCEPTOR(int, setvbuf, FILE *stream, char *buf, int mode, size_t size) {
345+
__rtsan_notify_intercepted_call("setvbuf");
346+
return REAL(setvbuf)(stream, buf, mode, size);
347+
}
348+
#define RTSAN_MAYBE_INTERCEPT_SETBUF INTERCEPT_FUNCTION(setbuf)
349+
#define RTSAN_MAYBE_INTERCEPT_SETBUFFER INTERCEPT_FUNCTION(setbuffer)
350+
#define RTSAN_MAYBE_INTERCEPT_SETLINEBUF INTERCEPT_FUNCTION(setlinebuf)
351+
#define RTSAN_MAYBE_INTERCEPT_SETVBUF INTERCEPT_FUNCTION(setvbuf)
352+
#else
353+
#define RTSAN_MAYBE_INTERCEPT_SETBUF
354+
#define RTSAN_MAYBE_INTERCEPT_SETBUFFER
355+
#define RTSAN_MAYBE_INTERCEPT_SETLINEBUF
356+
#define RTSAN_MAYBE_INTERCEPT_SETVBUF
357+
#endif
358+
328359
INTERCEPTOR(int, puts, const char *s) {
329360
__rtsan_notify_intercepted_call("puts");
330361
return REAL(puts)(s);
@@ -986,6 +1017,10 @@ void __rtsan::InitializeInterceptors() {
9861017
RTSAN_MAYBE_INTERCEPT_FOPENCOOKIE;
9871018
RTSAN_MAYBE_INTERCEPT_OPEN_MEMSTREAM;
9881019
RTSAN_MAYBE_INTERCEPT_FMEMOPEN;
1020+
RTSAN_MAYBE_INTERCEPT_SETBUF;
1021+
RTSAN_MAYBE_INTERCEPT_SETBUFFER;
1022+
RTSAN_MAYBE_INTERCEPT_SETLINEBUF;
1023+
RTSAN_MAYBE_INTERCEPT_SETVBUF;
9891024
INTERCEPT_FUNCTION(lseek);
9901025
RTSAN_MAYBE_INTERCEPT_LSEEK64;
9911026
INTERCEPT_FUNCTION(dup);

compiler-rt/lib/rtsan/tests/rtsan_test_interceptors_posix.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,56 @@ TEST_F(RtsanFileTest, FmemOpenDiesWhenRealtime) {
403403
}
404404
#endif
405405

406+
#if SANITIZER_INTERCEPT_SETVBUF
407+
TEST_F(RtsanFileTest, SetbufDieWhenRealtime) {
408+
char buffer[BUFSIZ];
409+
FILE *f = fopen(GetTemporaryFilePath(), "w");
410+
EXPECT_THAT(f, Ne(nullptr));
411+
412+
auto Func = [&f, &buffer]() { setbuf(f, buffer); };
413+
414+
ExpectRealtimeDeath(Func, "setbuf");
415+
ExpectNonRealtimeSurvival(Func);
416+
}
417+
418+
TEST_F(RtsanFileTest, SetbufferDieWhenRealtime) {
419+
char buffer[1024];
420+
size_t size = sizeof(buffer);
421+
FILE *f = fopen(GetTemporaryFilePath(), "w");
422+
EXPECT_THAT(f, Ne(nullptr));
423+
424+
auto Func = [&f, &buffer, &size]() { setbuffer(f, buffer, size); };
425+
426+
ExpectRealtimeDeath(Func, "setbuffer");
427+
ExpectNonRealtimeSurvival(Func);
428+
}
429+
430+
TEST_F(RtsanFileTest, SetvbufDieWhenRealtime) {
431+
char buffer[1024];
432+
size_t size = sizeof(buffer);
433+
FILE *f = fopen(GetTemporaryFilePath(), "w");
434+
EXPECT_THAT(f, Ne(nullptr));
435+
436+
auto Func = [&f, &buffer, &size]() {
437+
int r = setvbuf(f, buffer, _IOFBF, size);
438+
EXPECT_THAT(r, Eq(0));
439+
};
440+
441+
ExpectRealtimeDeath(Func, "setvbuf");
442+
ExpectNonRealtimeSurvival(Func);
443+
}
444+
445+
TEST_F(RtsanFileTest, SetlinebufDieWhenRealtime) {
446+
FILE *f = fopen(GetTemporaryFilePath(), "w");
447+
EXPECT_THAT(f, Ne(nullptr));
448+
449+
auto Func = [&f]() { setlinebuf(f); };
450+
451+
ExpectRealtimeDeath(Func, "setlinebuf");
452+
ExpectNonRealtimeSurvival(Func);
453+
}
454+
#endif
455+
406456
class RtsanOpenedFileTest : public RtsanFileTest {
407457
protected:
408458
void SetUp() override {

0 commit comments

Comments
 (0)