summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_linux.cpp
diff options
context:
space:
mode:
authorJulian Lettner <jlettner@apple.com>2019-10-10 17:19:58 +0000
committerJulian Lettner <jlettner@apple.com>2019-10-10 17:19:58 +0000
commit6fa614831f7986043e08b25951fe7407b07e60bf (patch)
treea0cc4cffd4f9f7a256c77285a9c73746ad9f6d10 /lib/sanitizer_common/sanitizer_linux.cpp
parent637654f8efbe34a83e792b1f38393fc723f14074 (diff)
downloadcompiler-rt-6fa614831f7986043e08b25951fe7407b07e60bf.tar.gz
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 git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@374384 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_linux.cpp')
-rw-r--r--lib/sanitizer_common/sanitizer_linux.cpp6
1 files changed, 6 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_linux.cpp b/lib/sanitizer_common/sanitizer_linux.cpp
index d23009075..0b53da6c3 100644
--- a/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/lib/sanitizer_common/sanitizer_linux.cpp
@@ -1849,6 +1849,12 @@ SignalContext::WriteFlag SignalContext::GetWriteFlag() const {
#endif
}
+bool SignalContext::IsTrueFaultingAddress() const {
+ auto si = static_cast<const siginfo_t *>(siginfo);
+ // SIGSEGV signals without a true fault address have si_code set to 128.
+ return si->si_signo == SIGSEGV && si->si_code != 128;
+}
+
void SignalContext::DumpAllRegisters(void *context) {
// FIXME: Implement this.
}