Skip to content

Commit 1a17ad9

Browse files
committed
[PR] vitalybuka - Fix va_args in open in tsan
1 parent d61ad67 commit 1a17ad9

File tree

4 files changed

+43
-27
lines changed

4 files changed

+43
-27
lines changed

compiler-rt/lib/rtsan/rtsan_interceptors.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -58,20 +58,13 @@ struct DlsymAlloc : public DlSymAllocator<DlsymAlloc> {
5858
} // namespace
5959

6060
// Filesystem
61-
static bool open_reads_va_args(int oflag) {
62-
#ifdef O_TMPFILE
63-
return (oflag & (O_CREAT | O_TMPFILE)) != 0;
64-
#else
65-
return (oflag & O_CREAT) != 0;
66-
#endif
67-
}
6861

6962
INTERCEPTOR(int, open, const char *path, int oflag, ...) {
7063
// TODO Establish whether we should intercept here if the flag contains
7164
// O_NONBLOCK
7265
__rtsan_notify_intercepted_call("open");
7366

74-
if (open_reads_va_args(oflag)) {
67+
if (OpenReadsVaArgs(oflag)) {
7568
va_list args;
7669
va_start(args, oflag);
7770
const mode_t mode = va_arg(args, int);
@@ -88,13 +81,15 @@ INTERCEPTOR(int, open64, const char *path, int oflag, ...) {
8881
// O_NONBLOCK
8982
__rtsan_notify_intercepted_call("open64");
9083

91-
va_list args;
92-
va_start(args, oflag);
93-
const mode_t mode = va_arg(args, int);
94-
va_end(args);
84+
if (OpenReadsVaArgs(oflag)) {
85+
va_list args;
86+
va_start(args, oflag);
87+
const mode_t mode = va_arg(args, int);
88+
va_end(args);
89+
return REAL(open64)(path, oflag, mode);
90+
}
9591

96-
const int result = REAL(open64)(path, oflag, mode);
97-
return result;
92+
return REAL(open64)(path, oflag);
9893
}
9994
#define RTSAN_MAYBE_INTERCEPT_OPEN64 INTERCEPT_FUNCTION(open64)
10095
#else
@@ -106,7 +101,7 @@ INTERCEPTOR(int, openat, int fd, const char *path, int oflag, ...) {
106101
// O_NONBLOCK
107102
__rtsan_notify_intercepted_call("openat");
108103

109-
if (open_reads_va_args(oflag)) {
104+
if (OpenReadsVaArgs(oflag)) {
110105
va_list args;
111106
va_start(args, oflag);
112107
const mode_t mode = va_arg(args, int);
@@ -123,13 +118,15 @@ INTERCEPTOR(int, openat64, int fd, const char *path, int oflag, ...) {
123118
// O_NONBLOCK
124119
__rtsan_notify_intercepted_call("openat64");
125120

126-
va_list args;
127-
va_start(args, oflag);
128-
mode_t mode = va_arg(args, int);
129-
va_end(args);
121+
if (OpenReadsVaArgs(oflag)) {
122+
va_list args;
123+
va_start(args, oflag);
124+
const mode_t mode = va_arg(args, int);
125+
va_end(args);
126+
return REAL(openat64)(fd, path, oflag, mode);
127+
}
130128

131-
const int result = REAL(openat64)(fd, path, oflag, mode);
132-
return result;
129+
return REAL(openat64)(fd, path, oflag);
133130
}
134131
#define RTSAN_MAYBE_INTERCEPT_OPENAT64 INTERCEPT_FUNCTION(openat64)
135132
#else

compiler-rt/lib/sanitizer_common/sanitizer_posix.cpp

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -353,7 +353,15 @@ bool ShouldMockFailureToOpen(const char *path) {
353353
internal_strncmp(path, "/proc/", 6) == 0;
354354
}
355355

356-
#if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_GO
356+
bool OpenReadsVaArgs(int oflag) {
357+
# ifdef O_TMPFILE
358+
return (oflag & (O_CREAT | O_TMPFILE)) != 0;
359+
# else
360+
return (oflag & O_CREAT) != 0;
361+
# endif
362+
}
363+
364+
# if SANITIZER_LINUX && !SANITIZER_ANDROID && !SANITIZER_GO
357365
int GetNamedMappingFd(const char *name, uptr size, int *flags) {
358366
if (!common_flags()->decorate_proc_maps || !name)
359367
return -1;

compiler-rt/lib/sanitizer_common/sanitizer_posix.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ bool IsStateDetached(int state);
108108
fd_t ReserveStandardFds(fd_t fd);
109109

110110
bool ShouldMockFailureToOpen(const char *path);
111+
bool OpenReadsVaArgs(int oflag);
111112

112113
// Create a non-file mapping with a given /proc/self/maps name.
113114
uptr MmapNamed(void *addr, uptr length, int prot, int flags, const char *name);

compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1680,13 +1680,23 @@ TSAN_INTERCEPTOR(int, fstat64, int fd, void *buf) {
16801680
#endif
16811681

16821682
TSAN_INTERCEPTOR(int, open, const char *name, int oflag, ...) {
1683-
va_list ap;
1684-
va_start(ap, oflag);
1685-
mode_t mode = va_arg(ap, int);
1686-
va_end(ap);
1683+
mode_t mode = 0;
1684+
if (OpenReadsVaArgs(oflag)) {
1685+
va_list ap;
1686+
va_start(ap, oflag);
1687+
mode = va_arg(ap, int);
1688+
va_end(ap);
1689+
}
1690+
16871691
SCOPED_TSAN_INTERCEPTOR(open, name, oflag, mode);
16881692
READ_STRING(thr, pc, name, 0);
1689-
int fd = REAL(open)(name, oflag, mode);
1693+
1694+
int fd;
1695+
if (OpenReadsVaArgs(oflag))
1696+
fd = REAL(open)(name, oflag, mode);
1697+
else
1698+
fd = REAL(open)(name, oflag);
1699+
16901700
if (fd >= 0)
16911701
FdFileCreate(thr, pc, fd);
16921702
return fd;

0 commit comments

Comments
 (0)