[compiler-rt] [rtsan] Fix va_args handling in open functions (PR #108291)
Chris Apple via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 11 14:05:34 PDT 2024
https://github.com/cjappl created https://github.com/llvm/llvm-project/pull/108291
It is only valid to read from the variadic parameter if O_CREAT is specified in the input flags, otherwise we should pass nothing in.
>From 1363f42967ea729026fbccdbadd63ea1916bb002 Mon Sep 17 00:00:00 2001
From: Chris Apple <cja-private at pm.me>
Date: Wed, 11 Sep 2024 14:41:14 -0600
Subject: [PATCH] [rtsan] Fix va_args handling in open functions
---
compiler-rt/lib/rtsan/rtsan_interceptors.cpp | 28 +++++++++++---------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/compiler-rt/lib/rtsan/rtsan_interceptors.cpp b/compiler-rt/lib/rtsan/rtsan_interceptors.cpp
index 409e27c3ad3234..a9398cf284d827 100644
--- a/compiler-rt/lib/rtsan/rtsan_interceptors.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_interceptors.cpp
@@ -64,13 +64,15 @@ INTERCEPTOR(int, open, const char *path, int oflag, ...) {
// O_NONBLOCK
__rtsan_expect_not_realtime("open");
- va_list args;
- va_start(args, oflag);
- const mode_t mode = va_arg(args, int);
- va_end(args);
+ if (oflag & O_CREAT) {
+ va_list args;
+ va_start(args, oflag);
+ const mode_t mode = va_arg(args, int);
+ va_end(args);
+ return REAL(open)(path, oflag, mode);
+ }
- const int result = REAL(open)(path, oflag, mode);
- return result;
+ return REAL(open)(path, oflag);
}
INTERCEPTOR(int, openat, int fd, const char *path, int oflag, ...) {
@@ -78,13 +80,15 @@ INTERCEPTOR(int, openat, int fd, const char *path, int oflag, ...) {
// O_NONBLOCK
__rtsan_expect_not_realtime("openat");
- va_list args;
- va_start(args, oflag);
- mode_t mode = va_arg(args, int);
- va_end(args);
+ if (oflag & O_CREAT) {
+ va_list args;
+ va_start(args, oflag);
+ const mode_t mode = va_arg(args, int);
+ va_end(args);
+ return REAL(openat)(fd, path, oflag, mode);
+ }
- const int result = REAL(openat)(fd, path, oflag, mode);
- return result;
+ return REAL(openat)(fd, path, oflag);
}
INTERCEPTOR(int, creat, const char *path, mode_t mode) {
More information about the llvm-commits
mailing list