summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2016-02-11 16:44:35 +0000
committerReid Kleckner <rnk@google.com>2016-02-11 16:44:35 +0000
commit14fc549a107abe6366c0d4c66011dd5cdefac936 (patch)
tree39753d70d71c85cd2016c88b88614d89716252a5 /lib/sanitizer_common
parent126028cdff0bf07c8de11acc04b89fc9c7490321 (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.cc13
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);
}