Skip to content

Commit f59d544

Browse files
author
git apple-llvm automerger
committed
Merge commit '6888a193ba8c' from swift/release/5.3 into swift/master
2 parents bdbad8d + 6888a19 commit f59d544

File tree

2 files changed

+41
-6
lines changed

2 files changed

+41
-6
lines changed

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

+17-6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
#include "tsan_mman.h"
3232
#include "tsan_fd.h"
3333

34+
#include <stdarg.h>
35+
3436
using namespace __tsan;
3537

3638
#if SANITIZER_FREEBSD || SANITIZER_MAC
@@ -135,6 +137,7 @@ const int PTHREAD_BARRIER_SERIAL_THREAD = -1;
135137
#endif
136138
const int MAP_FIXED = 0x10;
137139
typedef long long_t;
140+
typedef __sanitizer::u16 mode_t;
138141

139142
// From /usr/include/unistd.h
140143
# define F_ULOCK 0 /* Unlock a previously locked region. */
@@ -1505,20 +1508,28 @@ TSAN_INTERCEPTOR(int, fstat64, int fd, void *buf) {
15051508
#define TSAN_MAYBE_INTERCEPT_FSTAT64
15061509
#endif
15071510

1508-
TSAN_INTERCEPTOR(int, open, const char *name, int flags, int mode) {
1509-
SCOPED_TSAN_INTERCEPTOR(open, name, flags, mode);
1511+
TSAN_INTERCEPTOR(int, open, const char *name, int oflag, ...) {
1512+
va_list ap;
1513+
va_start(ap, oflag);
1514+
mode_t mode = va_arg(ap, int);
1515+
va_end(ap);
1516+
SCOPED_TSAN_INTERCEPTOR(open, name, oflag, mode);
15101517
READ_STRING(thr, pc, name, 0);
1511-
int fd = REAL(open)(name, flags, mode);
1518+
int fd = REAL(open)(name, oflag, mode);
15121519
if (fd >= 0)
15131520
FdFileCreate(thr, pc, fd);
15141521
return fd;
15151522
}
15161523

15171524
#if SANITIZER_LINUX
1518-
TSAN_INTERCEPTOR(int, open64, const char *name, int flags, int mode) {
1519-
SCOPED_TSAN_INTERCEPTOR(open64, name, flags, mode);
1525+
TSAN_INTERCEPTOR(int, open64, const char *name, int oflag, ...) {
1526+
va_list ap;
1527+
va_start(ap, oflag);
1528+
mode_t mode = va_arg(ap, int);
1529+
va_end(ap);
1530+
SCOPED_TSAN_INTERCEPTOR(open64, name, oflag, mode);
15201531
READ_STRING(thr, pc, name, 0);
1521-
int fd = REAL(open64)(name, flags, mode);
1532+
int fd = REAL(open64)(name, oflag, mode);
15221533
if (fd >= 0)
15231534
FdFileCreate(thr, pc, fd);
15241535
return fd;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
// RUN: %clangxx_tsan -O1 %s -o %t && %run %t %t.tmp 2>&1 | FileCheck %s
2+
#include <stdio.h>
3+
#include <assert.h>
4+
#include <fcntl.h>
5+
#include <unistd.h>
6+
#include <sys/stat.h>
7+
8+
int main(int argc, char *argv[]) {
9+
fprintf(stderr, "Hello world.\n");
10+
assert(argv[1]);
11+
unlink(argv[1]);
12+
int fd = open(argv[1], O_RDWR | O_CREAT, 0600);
13+
assert(fd != -1);
14+
struct stat info;
15+
int result = fstat(fd, &info);
16+
fprintf(stderr, "permissions = 0%o\n", info.st_mode & ~S_IFMT);
17+
assert(result == 0);
18+
close(fd);
19+
fprintf(stderr, "Done.\n");
20+
}
21+
22+
// CHECK: Hello world.
23+
// CHECK: permissions = 0600
24+
// CHECK: Done.

0 commit comments

Comments
 (0)