Reland "[ASan] Do not misrepresent high value address dereferences as null dereferences"
authorJulian Lettner <jlettner@apple.com>
Thu, 10 Oct 2019 17:19:58 +0000 (17:19 +0000)
committerJulian Lettner <jlettner@apple.com>
Thu, 10 Oct 2019 17:19:58 +0000 (17:19 +0000)
commit99c9d7bd6369a7505b86d7ea75a573265436e34a
tree42bc06a07f8bfe46307e337abe8cc6ea622a9b30
parentdc895a325f8df7fd10663e7cbeaaa783b2a37aa6
Reland "[ASan] Do not misrepresent high value address dereferences as null dereferences"

Updated: Removed offending TODO comment.

Dereferences with addresses above the 48-bit hardware addressable range
produce "invalid instruction" (instead of "invalid access") hardware
exceptions (there is no hardware address decoding logic for those bits),
and the address provided by this exception is the address of the
instruction (not the faulting address).  The kernel maps the "invalid
instruction" to SEGV, but fails to provide the real fault address.

Because of this ASan lies and says that those cases are null
dereferences.  This downgrades the severity of a found bug in terms of
security.  In the ASan signal handler, we can not provide the real
faulting address, but at least we can try not to lie.

rdar://50366151

Reviewed By: vitalybuka

Differential Revision: https://reviews.llvm.org/D68676

> llvm-svn: 374265

llvm-svn: 374384
compiler-rt/lib/asan/asan_errors.h
compiler-rt/lib/sanitizer_common/sanitizer_common.h
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
compiler-rt/lib/sanitizer_common/sanitizer_mac.cpp
compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_report.cpp
compiler-rt/lib/sanitizer_common/sanitizer_win.cpp
compiler-rt/test/asan/TestCases/Posix/high-address-dereference.c [new file with mode: 0644]