summaryrefslogtreecommitdiff
path: root/lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc
diff options
context:
space:
mode:
authorKostya Serebryany <kcc@google.com>2016-09-09 02:13:27 +0000
committerKostya Serebryany <kcc@google.com>2016-09-09 02:13:27 +0000
commit5dc69d4ce1de5ac3c345cfb19873b491626215e1 (patch)
treedfb2a0c1ed94a870c0b9b93b436d05f188421d4a /lib/sanitizer_common/sanitizer_stacktrace_libcdep.cc
parentf5a665d965b8170a33c676e90bce521b8b75e4f7 (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.cc3
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"