Commit Graph

14211 Commits

Author SHA1 Message Date
David CARLIER
97fd435eea [rtsan] intercept accept4 syscall. (#117278) 2024-12-05 07:37:26 -08:00
Chris Apple
af4ae12780 [rtsan] Add fork/execve interceptors (#117198) 2024-12-04 16:38:37 -08:00
ChiaHungDuan
9c5217c4ed [scudo] Use internal list to manage the LRU cache (#117946) 2024-12-04 11:31:41 -08:00
bernhardu
b8d857efac [win/asan] Populate test for function GetInstructionSize. (#118204)
This puts the content of GetInstructionSize into a test.
There are 5 cases missing, which I have already or would like to propose
a fix later.
2024-12-04 18:47:13 +01:00
Mészáros Gergely
bba2507c19 [compiler-rt][MSVC][CMake] Wrap Linker flags for ICX (#118496)
RFC:
https://discourse.llvm.org/t/rfc-cmake-linker-flags-need-wl-equivalent-for-intel-c-icx-on-windows/82446

My previous pass missed some flags because I used
`-Werror=unknown-argument`, but `/D`, `/I` and `/O` are accepted by
clang (even when only linking), but mean different things than intended
for `link.exe`.
2024-12-04 10:09:29 +01:00
Phoebe Wang
a63931292b [X86] Fix typo of gracemont (#118486) 2024-12-03 20:56:52 +08:00
Dimitry Andric
867a1d621d [sanitizer_common] mark __elf_aux_vector as weak on FreeBSD (#118110)
At some point FreeBSD introduced libsys as a wrapper between syscalls
and libc, and then linking sanitized programs started failing with:

```text
  # c++ -fsanitize=address main.cc
  ld: error: undefined symbol: __elf_aux_vector
  >>> referenced by sanitizer_linux_libcdep.cpp:950 (/usr/src/contrib/llvm-project/compiler-rt/lib/sanitizer_common/sanitizer_linux_libcdep.cpp:950)
  >>>               sanitizer_linux_libcdep.o:(__sanitizer::ReExec()) in archive /usr/lib/clang/17/lib/freebsd/libclang_rt.asan-x86_64.a
  c++: error: linker command failed with exit code 1 (use -v to see invocation)
```

Mark `__elf_aux_vector` as weak in the internal sanitizer declaration,
so the linker will accept it at link time. The dynamic linker will then
take care of the symbol at run time.
2024-12-03 00:31:19 +01:00
Chris Apple
eae30a240e [rtsan] Add syscall interceptor (#118250)
This is a complex one - `syscall` is used when people want to bypass
libc and make the call directly

However, this call:
* Has a variable amount of arguments (up to 6, typically)
* Has arguments that can be any type, (think of whatever arguments go in
to the libc call, or see more details here
https://syscalls.mebeim.net/?table=x86/64/x64/latest)


I've tried to put in a couple tests to ensure we aren't mucking with the
underlying functionality and they seem to be working.
2024-12-02 06:29:54 -08:00
Phoebe Wang
3348b4688f [X86][compiler-rt] Split CPU names even they have the same subtype (#118237)
Fixes: #118205
2024-12-02 18:51:19 +08:00
Chris Apple
4a074330c6 [rtsan] Intercept various file system functions (#118183)
Adds interceptors for
* chmod
* fchmod
* mkdir
* rmdir
* umask
2024-12-01 07:40:04 -08:00
Chris Apple
f28e071dc0 [rtsan] NFC: Fix style of some interceptors not using MAYBE (#118145)
There were a few interceptors that weren't using the newer MAYBE style -
fixed them up for uniform style.
2024-11-29 15:50:33 -08:00
bernhardu
a943922c0d [win/asan] GetInstructionSize: Remove duplicate instruction FF 25 .... (#116894)
It appears already some lines above with this comment:
  "Cannot overwrite control-instruction. Return 0 to indicate failure.".

Replacing just the comment in the first appearance.

Found after creating the test in #113085.
2024-11-29 09:17:37 +01:00
Min-Yih Hsu
96dd39c575 [XRay] Add __xray_default_options to specify build-time defined options (#117921)
Similar to `__asan_default_options`, users can specify default options
upon building the instrumented binaries by providing their own
definition of `__xray_default_options` which returns the option strings.

This is useful in cases where setting the `XRAY_OPTIONS` environment
variable might be difficult. Plus, it's a convenient way to populate
XRay options when you always want the instrumentation to be enabled.
2024-11-28 22:48:57 -08:00
Alexander Richardson
a4c8ef0f40 [compiler-rt] Fix detecting _Float16 support for secondary targets (#117813)
It turns out we were not passing -m32 to the check_c_source_compiles()
invocation since CMAKE_REQUIRE_FLAGS needs to be string separated list
and
we were passing a ;-separated CMake list which appears to be parsed by
CMake as 'ignore all arguments beyond the first'.
Fix this by transforming the list to a command line first.

With this change, Clang 17 no longer claims to support _Float16 for
i386.
2024-11-28 19:42:47 +01:00
Chris Apple
3a8b28f698 [rtsan] Add ioctl interceptor (#117569) 2024-11-26 15:17:04 -08:00
Vitaly Buka
8ffe63fb55 [nfc][asan] Fix typo in comment 2024-11-26 14:30:26 -08:00
Joel E. Denny
81349b84eb [sanitizer] Use /tmp/ not /tmp/dir/ in tests (#117759)
Tests fail if the user doesn't own /tmp/dir/. On hosts with multiple
users running the test suite, who owns /tmp/dir/ can become a race.
2024-11-26 14:22:14 -08:00
bernhardu
36b1811da4 [win/asan] Add a test skeleton for function GetInstructionSize. (#116948)
Was first part of PR #113085.
2024-11-26 11:02:48 +01:00
B I Mohammed Abbas
a5dd646360 Add extendhfxf2 into compiler rt (#113897)
Retry of pr #109090 and #111099.

Co-authored-by: Alexander Richardson <alexrichardson@google.com>
2024-11-25 10:19:27 -08:00
Hans
55f5d68c2d [win/asan] Recognize mov QWORD PTR [rip + X], reg (#117335)
This comes up when intercepting clang-built `__sanitizer_cov` functions.
2024-11-25 09:50:08 +01:00
gbMattN
4d4a353b8e [TSan] Increase the number of simultaneously locked mutexes that a thread can hold (#116409)
I've run into an issue where TSan can't be used on some code without
turning off deadlock detection because a thread tries to hold too many
mutexes. It would be preferable to be able to use deadlock detection as
that is a major benefit of TSan.

Its mentioned in https://github.com/google/sanitizers/issues/950 that
the 64 mutex limit was an arbitrary number. I've increased it to 128 and
all the tests still pass. Considering the increasing number of cores on
CPUs and how programs can now use more threads to take advantage of it,
I think raising the limit to 128 would be some good future proofing

---------

Co-authored-by: Vitaly Buka <vitalybuka@google.com>
2024-11-24 00:58:39 -08:00
Vitaly Buka
5fa0345d90 [tsan] Unwind for CHECK according to fast_unwind_on_fatal (#117470)
It's needed for #116409, which hangs with slow
unwind.
2024-11-24 00:25:06 -08:00
bernhardu
6c52a18a1d [win/asan] GetInstructionSize: Fix 8A 05 ... to return 6 again. (#116889)
This was already the case before 3bd8f4e,
which probably accidentally inserted
a few new instructions and a return 4 in between.
2024-11-21 23:17:11 +02:00
Thurston Dang
9ba6672b9f [sanitizer_common] Intercept timespec_get except for hwasan (#117080)
Intercept timespec_get for all sanitizers except for hwasan
2024-11-21 12:29:18 -08:00
bernhardu
b89e774672 [win/asan] Avoid warnings in compiling interception_win_test.cpp. (#116887)
Example:
  warning: unused variable 'kPatchableCode12' [-Wunused-const-variable]
2024-11-21 22:11:49 +02:00
Josh Stone
667e1fadcf [profile] Use base+vaddr for __llvm_write_binary_ids note pointers (#114907)
This function is always examining its own ELF headers in memory, but it
was trying to use conditions between examining files or memory, and it
wasn't accounting for LOAD offsets at runtime. This is especially bad if
a loaded segment has additional padding that's not in the file offsets.

Now we do a first scan of the program headers to figure out the runtime
base address based on `PT_PHDR` and/or `PT_DYNAMIC` (else assume zero),
similar to libc's `do_start`. Then each `PT_NOTE` pointer is simply the
base plus the segments's `pt_vaddr`, which includes LOAD offsets.

Fixes #114605
2024-11-21 10:14:29 -08:00
Chris Apple
595e484c08 [rtsan] Add option to allow printing of duplicate stacks (suppress_equal_stacks) (#117069)
Following the example of tsan, where we took the name

This would allow users to determine if they want to see ALL output from
rtsan.

Additionally, remove the UNLIKELY hint, as it is now up to the flag whether or
not it is likely that we go through this conditional.
2024-11-21 06:32:05 -08:00
Chris Apple
963b8e36bb [rtsan] Add sched_yield interceptor (#117084)
This calls the system calls switch_pri and sys_ulock_wait. It also is
one of the more straightforwardly rt-unsafe, in that it gives up this
thread's timeslice.
2024-11-21 06:30:45 -08:00
Chris Apple
934140a335 [rtsan] Remove mkfifoat interceptor (#116997)
This partially reverts #116915
[fce917d](fce917d39d)

mkfifoat was improperly guarded against in MacOS systems
2024-11-20 08:27:58 -08:00
Chris Apple
fce917d39d [rtsan] Add pipe, mkfifo interceptors (#116915)
## Why we think this are unsafe

Again, these correspond directly to system calls on linux and OSX. They
are two ways to do interprocess communication so it would make sense
that they take some synchronization by the OS.
2024-11-20 07:47:14 -08:00
Daniel Kiss
77bf34c315 [AArch64][compiler-rt] Add LSE support for Windows. (#116706) 2024-11-20 11:05:31 +01:00
Fangrui Song
ac38ab594f [lsan] Use VReport if not REGISTERS_AVAILABLE (#116555)
Certain tests (many are from lld/test) run `... '2>&1 | count 0` to
ensure that there is no stderr message.

GetRegistersAndSP may rarely fail, leading to
a spurious failure like (with a local hack to make `count` dump the
input):

```
+ /home/ray/llvm/out/asan/bin/ld.lld func1-gcs.o func2-gcs.o func3-gcs.o -o /dev/null -z gcs-report=warning -z gcs=never
+ /home/ray/llvm/out/asan/bin/count 0
Expected 0 lines, got 1.
==2403039==Unable to get registers from thread 2403018.
```

The failure can reliably be reproduced by running `ninja check-lld` a
few times under asan+lsan (see the bot
sanitizer-x86_64-linux-bootstrap-asan).
2024-11-20 01:07:28 -08:00
Chris Apple
3c8818cf2d [rtsan] Add more file descriptor interceptors - dup*, lseek (#116853)
# Why we think these are real-time unsafe

They correspond directly to system calls in linux and OSX, they are
manipulating a shared resource, which likely takes some operating-system
synchronization.
2024-11-19 14:54:14 -08:00
Chris Apple
7c41b5ccdc [rtsan] Add support for ReportErrorSummary (#116424)
Adding support for the extra SUMMARY line that is output by most
compilers. This also adds the ability for end-users to specify their own
handlers for reporting these errors (see the test).
2024-11-19 14:53:47 -08:00
Florian Mayer
0488d1774b Reland "[Sanitizers] Intercept timer_create" (#113710) (#116717)
Original commit 2ec5c69b68 only
intercepted timer_create.

Because of how versioned libc symbols work, this could cause problems
where a newer `timer_create`
was used, and the result would be used by an older version. This would
cause crashes. This is why we
need to intercept all of the related functions.

Addresses https://github.com/llvm/llvm-project/issues/111847
2024-11-18 23:18:54 -08:00
Chris Apple
9c3665c8d2 [rtsan] Add I/O multiplexing interceptors (#115227)
Intercepts in the family of `poll`, `select` and modern equivalents
`epoll` (linux only) and `kqueue` bsd family only.

These calls mirror the names of the system calls they call, which have
been verified on mac at least (e.g. kevent calls the system call
kevent).
2024-11-18 15:29:49 -08:00
Freddy Ye
97836bed63 Reland "[X86] Support -march=diamondrapids (#113881)" (#116564)
Ref.: https://cdrdv2.intel.com/v1/dl/getContent/671368
2024-11-18 10:40:32 +08:00
Freddy Ye
90e92239bd Revert "[X86] Support -march=diamondrapids (#113881)" (#116563)
This reverts commit 826b845c9e.
2024-11-18 08:45:28 +08:00
Freddy Ye
826b845c9e [X86] Support -march=diamondrapids (#113881)
Ref.: https://cdrdv2.intel.com/v1/dl/getContent/671368
2024-11-18 08:31:17 +08:00
Chris Apple
d761b7485d [rtsan] NFC: Add comment about O_NONBLOCK behavior (#116189) 2024-11-14 15:49:00 -08:00
Enna1
9f96f1cb6f [sanitizer] print both class id and corresponding size when region is exhausted (#116186) 2024-11-14 12:18:11 -08:00
Thurston Dang
531acf9e2f Reapply "[sanitizer_common] AND signals in BlockSignals instead of deleting (#113443)" for non-Android Linux only (#115790)
The original patch (25fd366d6a) was
reverted in 083a5cdbea because it broke
some buildbots.

This revised patch makes two changes:
- Reverts to *pre-#98200* behavior for Android. This avoids a build
breakage on Android.
- Only define KeepUnblocked if SANITIZER_LINUX: this avoids a build
breakage on solaris, which does not support internal_sigdelset.
N.B. Other buildbot failures were non-sanitizer tests and are therefore
unrelated.

Original commit message:
    My earlier patch https://github.com/llvm/llvm-project/pull/98200
    caused a regression because it unconditionally unblocked synchronous
    signals, even if the user program had deliberately blocked them.
    This patch fixes the issue by checking the current signal mask, as
    suggested by Vitaly. It also adds tests.
    Fixes #113385
2024-11-14 10:35:35 -08:00
Wu Yingcong
6c9256dc5c [ASAN] fix a nullptr dereference error. (#116011)
`parent_context` is used without checking for nullptr and we can see in
LINE 50 that it could totally be nullptr. This patch addresses this
issue.
2024-11-13 15:46:57 -08:00
Daniel Kiss
2a1586dfb5 [compiler-rt] Add cpu model init for Windows. (#111961) 2024-11-13 11:05:40 +01:00
NAKAMURA Takumi
1c9467f148 compiler-rt/lib: Fix newline at eof 2024-11-12 23:41:25 +09:00
Feng Zou
28e4aad45a [X86][BF16] Add libcall for FP128 -> BF16 (#115825)
This is to fix #115710.
2024-11-12 15:54:09 +08:00
Florian Mayer
f9125ddc1f Revert "[libfuzzer] use timer_create() instead of setitimer() for linux" (#115811)
Reverts llvm/llvm-project#110274

Buildbots broke
2024-11-11 19:50:30 -08:00
Min
3b29a8a008 [libfuzzer] use timer_create() instead of setitimer() for linux (#110274)
SetTimer() now uses setitimer() to sending SIGALRM every `
UnitTimeoutSec/2 + 1` s
Set UnitTimeoutSec with the `-timeout=` option

"POSIX.1-2008 marks getitimer() and setitimer() obsolete" and also has
some issues regarding accuracy of the timers under load . See
https://linux.die.net/man/2/setitimer.
I propose using timer_create() and sigaction() ,See
http://man7.org/linux/man-pages/man2/timer_create.2.html

# test result on my x86_64 linux
`make check-fuzzer`

![image](https://github.com/user-attachments/assets/19b4e073-16a5-4daa-95ed-2cf4830c042f)
2024-11-11 19:12:30 -08:00
Vitaly Buka
9254b81990 [tsan] Fix typo in type (#115769)
Introduced with #114931
Fixes https://github.com/golang/go/issues/70283
2024-11-11 13:16:27 -08:00
Alexander Richardson
5082acce4f [compiler-rt] Add custom libc++ workaround for CMake < 3.26
The INSTALL_BYPRODUCTS ExternalProject_Add() argument was only added in
CMake 3.26 and the current minimum is 3.20. Work around this by using an
explicit ExternalProject_Add_Step() call for the install step with a
BYPRODUCTS argument. We can't keep using the `install` name here since that
is reserved by the CMake implementation and results in errors when used.

This commit should be reverted once LLVM depends on CMake 3.26.

Pull Request: https://github.com/llvm/llvm-project/pull/115677
2024-11-10 20:30:23 -08:00