@@ -64,13 +64,15 @@ INTERCEPTOR(int, open, const char *path, int oflag, ...) {
6464 // O_NONBLOCK
6565 __rtsan_notify_intercepted_call (" open" );
6666
67- va_list args;
68- va_start (args, oflag);
69- const mode_t mode = va_arg (args, int );
70- va_end (args);
67+ if (OpenReadsVaArgs (oflag)) {
68+ va_list args;
69+ va_start (args, oflag);
70+ const mode_t mode = va_arg (args, int );
71+ va_end (args);
72+ return REAL (open)(path, oflag, mode);
73+ }
7174
72- const int result = REAL (open)(path, oflag, mode);
73- return result;
75+ return REAL (open)(path, oflag);
7476}
7577
7678#if SANITIZER_INTERCEPT_OPEN64
@@ -79,13 +81,15 @@ INTERCEPTOR(int, open64, const char *path, int oflag, ...) {
7981 // O_NONBLOCK
8082 __rtsan_notify_intercepted_call (" open64" );
8183
82- va_list args;
83- va_start (args, oflag);
84- const mode_t mode = va_arg (args, int );
85- 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+ }
8691
87- const int result = REAL (open64)(path, oflag, mode);
88- return result;
92+ return REAL (open64)(path, oflag);
8993}
9094#define RTSAN_MAYBE_INTERCEPT_OPEN64 INTERCEPT_FUNCTION (open64)
9195#else
@@ -97,13 +101,15 @@ INTERCEPTOR(int, openat, int fd, const char *path, int oflag, ...) {
97101 // O_NONBLOCK
98102 __rtsan_notify_intercepted_call (" openat" );
99103
100- va_list args;
101- va_start (args, oflag);
102- mode_t mode = va_arg (args, int );
103- va_end (args);
104+ if (OpenReadsVaArgs (oflag)) {
105+ va_list args;
106+ va_start (args, oflag);
107+ const mode_t mode = va_arg (args, int );
108+ va_end (args);
109+ return REAL (openat)(fd, path, oflag, mode);
110+ }
104111
105- const int result = REAL (openat)(fd, path, oflag, mode);
106- return result;
112+ return REAL (openat)(fd, path, oflag);
107113}
108114
109115#if SANITIZER_INTERCEPT_OPENAT64
@@ -112,13 +118,15 @@ INTERCEPTOR(int, openat64, int fd, const char *path, int oflag, ...) {
112118 // O_NONBLOCK
113119 __rtsan_notify_intercepted_call (" openat64" );
114120
115- va_list args;
116- va_start (args, oflag);
117- mode_t mode = va_arg (args, int );
118- 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+ }
119128
120- const int result = REAL (openat64)(fd, path, oflag, mode);
121- return result;
129+ return REAL (openat64)(fd, path, oflag);
122130}
123131#define RTSAN_MAYBE_INTERCEPT_OPENAT64 INTERCEPT_FUNCTION (openat64)
124132#else
0 commit comments