Skip to content

Commit 6d890a0

Browse files
author
Mariusz Borsa
committed
[Sanitizers] Cleanup handling of stat64/statfs64
There are differences in handling of stat64/statfs64 calls by sanitizers between Linux and macOS. Versions of macOS starting with 10.6 drop the stat64/statfs64 APIs completely, relying on the linker to redirect stat/statfs to the appropriate 64 bit versions. Emitting variables needed by sanitizers is thus controlled by convoluted sets of conditions, involving Linux, IOS, macOS and Android, sprinkled around files. This change adresses it, allowing to specify presence/absence of stat64/statfs64 for each platform, in a single location. Also, it adresses the Android case which handles stat64, but not statfs64. Adding Vitaly as a reviewer since he seems to be actively working on sanitizers, perhaps can comment on the Android bit Differential Revision: https://reviews.llvm.org/D127343
1 parent 353324e commit 6d890a0

File tree

4 files changed

+28
-14
lines changed

4 files changed

+28
-14
lines changed

compiler-rt/lib/sanitizer_common/sanitizer_platform_interceptors.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,7 @@
330330
#define SANITIZER_INTERCEPT_GETMNTENT_R SI_LINUX_NOT_ANDROID
331331
#define SANITIZER_INTERCEPT_STATFS \
332332
(SI_FREEBSD || SI_MAC || SI_LINUX_NOT_ANDROID || SI_SOLARIS)
333-
#define SANITIZER_INTERCEPT_STATFS64 \
334-
(((SI_MAC && !TARGET_CPU_ARM64) && !SI_IOS) || SI_LINUX_NOT_ANDROID)
333+
#define SANITIZER_INTERCEPT_STATFS64 SANITIZER_HAS_STATFS64
335334
#define SANITIZER_INTERCEPT_STATVFS \
336335
(SI_FREEBSD || SI_NETBSD || SI_LINUX_NOT_ANDROID)
337336
#define SANITIZER_INTERCEPT_STATVFS64 SI_LINUX_NOT_ANDROID
@@ -468,7 +467,7 @@
468467
#define SANITIZER_INTERCEPT_STAT \
469468
(SI_FREEBSD || SI_MAC || SI_ANDROID || SI_NETBSD || SI_SOLARIS || \
470469
SI_STAT_LINUX)
471-
#define SANITIZER_INTERCEPT_STAT64 SI_STAT_LINUX
470+
#define SANITIZER_INTERCEPT_STAT64 SI_STAT_LINUX || SANITIZER_HAS_STAT64
472471
#define SANITIZER_INTERCEPT_LSTAT (SI_NETBSD || SI_FREEBSD || SI_STAT_LINUX)
473472
#define SANITIZER_INTERCEPT___XSTAT \
474473
((!SANITIZER_INTERCEPT_STAT && SI_POSIX) || SI_STAT_LINUX)

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_linux.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,12 +57,6 @@
5757

5858
using namespace __sanitizer;
5959

60-
namespace __sanitizer {
61-
#if !SANITIZER_ANDROID
62-
unsigned struct_statfs64_sz = sizeof(struct statfs64);
63-
#endif
64-
} // namespace __sanitizer
65-
6660
# if !defined(__powerpc64__) && !defined(__x86_64__) && \
6761
!defined(__aarch64__) && !defined(__mips__) && !defined(__s390__) && \
6862
!defined(__sparc__) && !defined(__riscv) && !defined(__hexagon__)

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -181,9 +181,9 @@ typedef struct user_fpregs elf_fpregset_t;
181181
namespace __sanitizer {
182182
unsigned struct_utsname_sz = sizeof(struct utsname);
183183
unsigned struct_stat_sz = sizeof(struct stat);
184-
#if !SANITIZER_IOS && !(SANITIZER_APPLE && TARGET_CPU_ARM64)
184+
#if SANITIZER_HAS_STAT64
185185
unsigned struct_stat64_sz = sizeof(struct stat64);
186-
#endif // !SANITIZER_IOS && !(SANITIZER_APPLE && TARGET_CPU_ARM64)
186+
#endif // SANITIZER_HAS_STAT64
187187
unsigned struct_rusage_sz = sizeof(struct rusage);
188188
unsigned struct_tm_sz = sizeof(struct tm);
189189
unsigned struct_passwd_sz = sizeof(struct passwd);
@@ -208,9 +208,9 @@ namespace __sanitizer {
208208
unsigned struct_regex_sz = sizeof(regex_t);
209209
unsigned struct_regmatch_sz = sizeof(regmatch_t);
210210

211-
#if (SANITIZER_APPLE && !TARGET_CPU_ARM64) && !SANITIZER_IOS
211+
#if SANITIZER_HAS_STATFS64
212212
unsigned struct_statfs64_sz = sizeof(struct statfs64);
213-
#endif // (SANITIZER_APPLE && !TARGET_CPU_ARM64) && !SANITIZER_IOS
213+
#endif // SANITIZER_HAS_STATFS64
214214

215215
#if SANITIZER_GLIBC || SANITIZER_FREEBSD || SANITIZER_NETBSD || SANITIZER_APPLE
216216
unsigned struct_fstab_sz = sizeof(struct fstab);

compiler-rt/lib/sanitizer_common/sanitizer_platform_limits_posix.h

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,25 @@
1919
#include "sanitizer_internal_defs.h"
2020
#include "sanitizer_platform.h"
2121

22+
#if SANITIZER_APPLE
23+
#include <sys/cdefs.h>
24+
#if !__DARWIN_ONLY_64_BIT_INO_T
25+
#define SANITIZER_HAS_STAT64 1
26+
#define SANITIZER_HAS_STATFS64 1
27+
#else
28+
#define SANITIZER_HAS_STAT64 0
29+
#define SANITIZER_HAS_STATFS64 0
30+
#endif
31+
#else
32+
// Must be SANITIZER_LINUX then
33+
#define SANITIZER_HAS_STAT64 1
34+
#if SANITIZER_ANDROID
35+
#define SANITIZER_HAS_STATFS64 0 // Intercepting statfs64 seems to be broken on Android
36+
#else
37+
#define SANITIZER_HAS_STATFS64 1
38+
#endif
39+
#endif
40+
2241
#if defined(__sparc__)
2342
// FIXME: This can't be included from tsan which does not support sparc yet.
2443
#include "sanitizer_glibc_version.h"
@@ -29,7 +48,7 @@
2948
namespace __sanitizer {
3049
extern unsigned struct_utsname_sz;
3150
extern unsigned struct_stat_sz;
32-
#if !SANITIZER_IOS
51+
#if SANITIZER_HAS_STAT64
3352
extern unsigned struct_stat64_sz;
3453
#endif
3554
extern unsigned struct_rusage_sz;
@@ -49,7 +68,9 @@ extern unsigned struct_itimerspec_sz;
4968
extern unsigned struct_sigevent_sz;
5069
extern unsigned struct_stack_t_sz;
5170
extern unsigned struct_sched_param_sz;
71+
#if SANITIZER_HAS_STATFS64
5272
extern unsigned struct_statfs64_sz;
73+
#endif
5374
extern unsigned struct_regex_sz;
5475
extern unsigned struct_regmatch_sz;
5576

0 commit comments

Comments
 (0)