diff options
author | Reid Kleckner <rnk@google.com> | 2016-02-11 16:44:35 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2016-02-11 16:44:35 +0000 |
commit | 14fc549a107abe6366c0d4c66011dd5cdefac936 (patch) | |
tree | 39753d70d71c85cd2016c88b88614d89716252a5 /lib/sanitizer_common | |
parent | 126028cdff0bf07c8de11acc04b89fc9c7490321 (diff) |
[Windows] Fill in read/write information in SignalContext
Implements https://github.com/google/sanitizers/issues/653
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@260539 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common')
-rw-r--r-- | lib/sanitizer_common/sanitizer_win.cc | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_win.cc b/lib/sanitizer_common/sanitizer_win.cc index 18fd01801..4a6dc34cf 100644 --- a/lib/sanitizer_common/sanitizer_win.cc +++ b/lib/sanitizer_common/sanitizer_win.cc @@ -744,8 +744,17 @@ SignalContext SignalContext::Create(void *siginfo, void *context) { #endif uptr access_addr = exception_record->ExceptionInformation[1]; - WriteFlag write_flag = SignalContext::UNKNOWN; // FIXME: compute this. - bool is_memory_access = false; // FIXME: compute this. + // The contents of this array are documented at + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa363082(v=vs.85).aspx + // The first element indicates read as 0, write as 1, or execute as 8. The + // second element is the faulting address. + WriteFlag write_flag = SignalContext::UNKNOWN; + switch (exception_record->ExceptionInformation[0]) { + case 0: write_flag = SignalContext::READ; break; + case 1: write_flag = SignalContext::WRITE; break; + case 8: write_flag = SignalContext::UNKNOWN; break; + } + bool is_memory_access = write_flag != SignalContext::UNKNOWN; return SignalContext(context, access_addr, pc, sp, bp, is_memory_access, write_flag); } |