diff options
author | Kostya Serebryany <kcc@google.com> | 2016-09-09 02:13:27 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2016-09-09 02:13:27 +0000 |
commit | 5dc69d4ce1de5ac3c345cfb19873b491626215e1 (patch) | |
tree | dfb2a0c1ed94a870c0b9b93b436d05f188421d4a /lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc | |
parent | f5a665d965b8170a33c676e90bce521b8b75e4f7 (diff) |
[sanitizer] fix a potential buffer overflow due to __sanitizer_symbolize_pc (need to put a zero after strncmp). LOL
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@281015 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc')
-rw-r--r-- | lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc index 1d5af733c..522fbeb9a 100644 --- a/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc +++ b/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc @@ -88,11 +88,13 @@ extern "C" { SANITIZER_INTERFACE_ATTRIBUTE void __sanitizer_symbolize_pc(uptr pc, const char *fmt, char *out_buf, uptr out_buf_size) { + if (!out_buf_size) return; using namespace __sanitizer; pc = StackTrace::GetPreviousInstructionPc(pc); SymbolizedStack *frame = Symbolizer::GetOrInit()->SymbolizePC(pc); if (!frame) { internal_strncpy(out_buf, "<can't symbolize>", out_buf_size); + out_buf[out_buf_size - 1] = 0; return; } InternalScopedString frame_desc(GetPageSizeCached()); @@ -100,5 +102,6 @@ void __sanitizer_symbolize_pc(uptr pc, const char *fmt, char *out_buf, common_flags()->symbolize_vs_style, common_flags()->strip_path_prefix); internal_strncpy(out_buf, frame_desc.data(), out_buf_size); + out_buf[out_buf_size - 1] = 0; } } // extern "C" |