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;
174174
175175# if SANITIZER_FREEBSD
176176# 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);
179177# endif
180178
181179namespace __sanitizer {
......@@ -265,9 +263,8 @@ ScopedBlockSignals::~ScopedBlockSignals() { SetSigProcMask(&saved_, nullptr); }
265263# if !SANITIZER_S390
266264uptr internal_mmap(void *addr, uptr length, int prot, int flags, int fd,
267265 u64 offset) {
268# if SANITIZER_FREEBSD
269 return (uptr)__sys_mmap(addr, length, prot, flags, fd, offset);
270# elif SANITIZER_LINUX_USES_64BIT_SYSCALLS
266 /* zig patch: use direct syscall for freebsd mmap */
267# if SANITIZER_FREEBSD || SANITIZER_LINUX_USES_64BIT_SYSCALLS
271268 return internal_syscall(SYSCALL(mmap), (uptr)addr, length, prot, flags, fd,
272269 offset);
273270# else
......@@ -942,6 +939,11 @@ int internal_fork() {
942939}
943940
944941# 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
945947int internal_sysctl(const int *name, unsigned int namelen, void *oldp,
946948 uptr *oldlenp, const void *newp, uptr newlen) {
947949 return internal_syscall(SYSCALL(__sysctl), name, namelen, oldp,
lib/libtsan/sanitizer_common/sanitizer_linux_libcdep.cpp+3-12
......@@ -69,8 +69,6 @@
6969# undef MAP_NORESERVE
7070# define MAP_NORESERVE 0
7171extern const Elf_Auxinfo *__elf_aux_vector __attribute__((weak));
72extern "C" int __sys_sigaction(int signum, const struct sigaction *act,
73 struct sigaction *oldact);
7472# endif
7573
7674# if SANITIZER_NETBSD
......@@ -100,24 +98,17 @@ namespace __sanitizer {
10098SANITIZER_WEAK_ATTRIBUTE int real_sigaction(int signum, const void *act,
10199 void *oldact);
102100
101/* zig patch: use direct syscall for freebsd sigaction (sanitizer_linux.cpp) */
102# if !SANITIZER_FREEBSD
103103int 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
113104# if !SANITIZER_GO
114105 if (&real_sigaction)
115106 return real_sigaction(signum, act, oldact);
116107# endif
117108 return sigaction(signum, (const struct sigaction *)act,
118109 (struct sigaction *)oldact);
119# endif
120110}
111# endif
121112
122113void GetThreadStackTopAndBottom(bool at_initialization, uptr *stack_top,
123114 uptr *stack_bottom) {