[compiler-rt][rtsan] symlink/symlinkat interception. (#134168)

This commit is contained in:
David CARLIER
2025-04-05 10:30:45 +01:00
committed by GitHub
parent 75bbf768a4
commit 6c9e098b39
2 changed files with 29 additions and 0 deletions

View File

@@ -322,6 +322,17 @@ INTERCEPTOR(int, ftruncate64, int fd, off64_t length) {
#define RTSAN_MAYBE_INTERCEPT_FTRUNCATE64
#endif
INTERCEPTOR(int, symlink, const char *target, const char *linkpath) {
__rtsan_notify_intercepted_call("symlink");
return REAL(symlink)(target, linkpath);
}
INTERCEPTOR(int, symlinkat, const char *target, int newdirfd,
const char *linkpath) {
__rtsan_notify_intercepted_call("symlinkat");
return REAL(symlinkat)(target, newdirfd, linkpath);
}
// Streams
INTERCEPTOR(FILE *, fopen, const char *path, const char *mode) {
@@ -1523,6 +1534,8 @@ void __rtsan::InitializeInterceptors() {
RTSAN_MAYBE_INTERCEPT_READLINKAT;
INTERCEPT_FUNCTION(unlink);
INTERCEPT_FUNCTION(unlinkat);
INTERCEPT_FUNCTION(symlink);
INTERCEPT_FUNCTION(symlinkat);
INTERCEPT_FUNCTION(truncate);
INTERCEPT_FUNCTION(ftruncate);
RTSAN_MAYBE_INTERCEPT_TRUNCATE64;

View File

@@ -897,6 +897,22 @@ TEST_F(RtsanOpenedFileTest, FtruncateDiesWhenRealtime) {
ExpectNonRealtimeSurvival(Func);
}
TEST_F(RtsanOpenedFileTest, SymlinkDiesWhenRealtime) {
auto Func = [&]() {
symlink("/tmp/rtsan_symlink_test", GetTemporaryFilePath());
};
ExpectRealtimeDeath(Func, "symlink");
ExpectNonRealtimeSurvival(Func);
}
TEST_F(RtsanOpenedFileTest, SymlinkatDiesWhenRealtime) {
auto Func = [&]() {
symlinkat("/tmp/rtsan_symlinkat_test", AT_FDCWD, GetTemporaryFilePath());
};
ExpectRealtimeDeath(Func, "symlinkat");
ExpectNonRealtimeSurvival(Func);
}
TEST_F(RtsanFileTest, FcloseDiesWhenRealtime) {
FILE *f = fopen(GetTemporaryFilePath(), "w");
EXPECT_THAT(f, Ne(nullptr));