[PATCH] D84570: [tsan] Fix the open and open64 interceptors to have correct declarations (variadic functions)
Kuba (Brecka) Mracek via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 24 17:20:53 PDT 2020
kubamracek created this revision.
kubamracek added reviewers: dvyukov, delcypher, dcoughlin, yln.
kubamracek added a project: Sanitizers.
Herald added subscribers: Sanitizers, Charusso, kristof.beyls.
Not matching the (real) variadic declaration makes the interceptor take garbage inputs on AArch64.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D84570
Files:
compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
compiler-rt/test/tsan/Darwin/variadic-open.cpp
Index: compiler-rt/test/tsan/Darwin/variadic-open.cpp
===================================================================
--- /dev/null
+++ compiler-rt/test/tsan/Darwin/variadic-open.cpp
@@ -0,0 +1,24 @@
+// RUN: %clangxx_tsan -O1 %s -o %t && %run %t %t.tmp 2>&1 | FileCheck %s
+#include <stdio.h>
+#include <assert.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+int main(int argc, char *argv[]) {
+ fprintf(stderr, "Hello world.\n");
+ assert(argv[1]);
+ unlink(argv[1]);
+ int fd = open(argv[1], O_RDWR | O_CREAT, 0644);
+ assert(fd != -1);
+ struct stat info;
+ int result = fstat(fd, &info);
+ fprintf(stderr, "permissions = 0%o\n", info.st_mode & ~S_IFMT);
+ assert(result == 0);
+ close(fd);
+ fprintf(stderr, "Done.\n");
+}
+
+// CHECK: Hello world.
+// CHECK: permissions = 0644
+// CHECK: Done.
Index: compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
===================================================================
--- compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
+++ compiler-rt/lib/tsan/rtl/tsan_interceptors_posix.cpp
@@ -31,6 +31,8 @@
#include "tsan_mman.h"
#include "tsan_fd.h"
+#include <stdarg.h>
+
using namespace __tsan;
#if SANITIZER_FREEBSD || SANITIZER_MAC
@@ -135,6 +137,7 @@
#endif
const int MAP_FIXED = 0x10;
typedef long long_t;
+typedef __sanitizer::u16 mode_t;
// From /usr/include/unistd.h
# define F_ULOCK 0 /* Unlock a previously locked region. */
@@ -1508,20 +1511,28 @@
#define TSAN_MAYBE_INTERCEPT_FSTAT64
#endif
-TSAN_INTERCEPTOR(int, open, const char *name, int flags, int mode) {
- SCOPED_TSAN_INTERCEPTOR(open, name, flags, mode);
+TSAN_INTERCEPTOR(int, open, const char *name, int oflag, ...) {
+ va_list ap;
+ va_start(ap, oflag);
+ mode_t mode = va_arg(ap, int);
+ va_end(ap);
+ SCOPED_TSAN_INTERCEPTOR(open, name, oflag, mode);
READ_STRING(thr, pc, name, 0);
- int fd = REAL(open)(name, flags, mode);
+ int fd = REAL(open)(name, oflag, mode);
if (fd >= 0)
FdFileCreate(thr, pc, fd);
return fd;
}
#if SANITIZER_LINUX
-TSAN_INTERCEPTOR(int, open64, const char *name, int flags, int mode) {
- SCOPED_TSAN_INTERCEPTOR(open64, name, flags, mode);
+TSAN_INTERCEPTOR(int, open64, const char *name, int oflag, ...) {
+ va_list ap;
+ va_start(ap, oflag);
+ mode_t mode = va_arg(ap, int);
+ va_end(ap);
+ SCOPED_TSAN_INTERCEPTOR(open64, name, oflag, mode);
READ_STRING(thr, pc, name, 0);
- int fd = REAL(open64)(name, flags, mode);
+ int fd = REAL(open64)(name, oflag, mode);
if (fd >= 0)
FdFileCreate(thr, pc, fd);
return fd;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D84570.280630.patch
Type: text/x-patch
Size: 2581 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200725/0e9326c9/attachment.bin>
More information about the llvm-commits
mailing list