authorgravatar for rajivperfect007@gmail.comRajiv Singh <rajivperfect007@gmail.com> 2025-10-26 11:12:22+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2025-10-26 11:12:22+01:00
logfe783d9ff39a31a3b39a7b7bb2c3ffed08b99bf4
tree289e9108235defc4e80a1bd3675846e64982a149
parent67c9d57e2735d4ad9846127d2fa140e61b945ee4
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

tsan: fix cross build for FreeBSD by using direct syscalls instead of libsys

This patch can hopefully be dropped in the future; see #24989. closes #24885 closes #24896 Co-authored-by: Alex Rønne Petersen <alex@alexrp.com>

2 files changed, 10 insertions(+), 17 deletions(-)

lib/libtsan/sanitizer_common/sanitizer_linux.cpp+7-5
...@@ -174,8 +174,6 @@ const int FUTEX_WAKE_PRIVATE = FUTEX_WAKE | FUTEX_PRIVATE_FLAG;...@@ -174,8 +174,6 @@ const int FUTEX_WAKE_PRIVATE = FUTEX_WAKE | FUTEX_PRIVATE_FLAG;
174174
175# if SANITIZER_FREEBSD175# if SANITIZER_FREEBSD
176# define SANITIZER_USE_GETENTROPY 1176# define SANITIZER_USE_GETENTROPY 1
177extern "C" void *__sys_mmap(void *addr, size_t len, int prot, int flags, int fd,
178 off_t offset);
179# endif177# endif
180178
181namespace __sanitizer {179namespace __sanitizer {
...@@ -265,9 +263,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }...@@ -265,9 +263,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
265# if !SANITIZER_S390263# if !SANITIZER_S390
266uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,264uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
267 u64 offset) {265 u64 offset) {
268# if SANITIZER_FREEBSD266 /* zig patch: use direct syscall for freebsd mmap */
269 return (uptr)__sys_mmap(addr, length, prot, flags, fd, offset);267# if SANITIZER_FREEBSD || SANITIZER_LINUX_USES_64BIT_SYSCALLS
270# elif SANITIZER_LINUX_USES_64BIT_SYSCALLS
271 return internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,268 return internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,
272 offset);269 offset);
273# else270# else
...@@ -942,6 +939,11 @@ int internal_fork() {...@@ -942,6 +939,11 @@ int internal_fork() {
942}939}
943940
944# if SANITIZER_FREEBSD941# if SANITIZER_FREEBSD
942int internal_sigaction(int signum, const void *act, void *oldact) {
943 /* zig patch: use direct syscall for freebsd mmap */
944 return internal_syscall(SYSCALL(sigaction), signum, (uptr)act, (uptr)oldact);
945}
946
945int internal_sysctl(const int *name, unsigned int namelen, void *oldp,947int internal_sysctl(const int *name, unsigned int namelen, void *oldp,
946 uptr *oldlenp, const void *newp, uptr newlen) {948 uptr *oldlenp, const void *newp, uptr newlen) {
947 return internal_syscall(SYSCALL(__sysctl), name, namelen, oldp,949 return internal_syscall(SYSCALL(__sysctl), name, namelen, oldp,
lib/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp+3-12
...@@ -69,8 +69,6 @@...@@ -69,8 +69,6 @@
69# undef MAP_NORESERVE69# undef MAP_NORESERVE
70# define MAP_NORESERVE 070# define MAP_NORESERVE 0
71extern const Elf_Auxinfo *__elf_aux_vector __attribute__((weak));71extern const Elf_Auxinfo *__elf_aux_vector __attribute__((weak));
72extern "C" int __sys_sigaction(int signum, const struct sigaction *act,
73 struct sigaction *oldact);
74# endif72# endif
7573
76# if SANITIZER_NETBSD74# if SANITIZER_NETBSD
...@@ -100,24 +98,17 @@ namespace __sanitizer {...@@ -100,24 +98,17 @@ namespace __sanitizer {
100SANITIZER_WEAK_ATTRIBUTE int real_sigaction(int signum, const void *act,98SANITIZER_WEAK_ATTRIBUTE int real_sigaction(int signum, const void *act,
101 void *oldact);99 void *oldact);
102100
101/* zig patch: use direct syscall for freebsd sigaction (sanitizer_linux.cpp) */
102# if !SANITIZER_FREEBSD
103int internal_sigaction(int signum, const void *act, void *oldact) {103int internal_sigaction(int signum, const void *act, void *oldact) {
104# if SANITIZER_FREEBSD
105 // On FreeBSD, call the sigaction syscall directly (part of libsys in FreeBSD
106 // 15) since the libc version goes via a global interposing table. Due to
107 // library initialization order the table can be relocated after the call to
108 // InitializeDeadlySignals() which then crashes when dereferencing the
109 // uninitialized pointer in libc.
110 return __sys_sigaction(signum, (const struct sigaction *)act,
111 (struct sigaction *)oldact);
112# else
113# if !SANITIZER_GO104# if !SANITIZER_GO
114 if (&real_sigaction)105 if (&real_sigaction)
115 return real_sigaction(signum, act, oldact);106 return real_sigaction(signum, act, oldact);
116# endif107# endif
117 return sigaction(signum, (const struct sigaction *)act,108 return sigaction(signum, (const struct sigaction *)act,
118 (struct sigaction *)oldact);109 (struct sigaction *)oldact);
119# endif
120}110}
111# endif
121112
122void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,113void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,
123 uptr *stack_bottom) {114 uptr *stack_bottom) {