Skip to content
Permalink
Browse files

[lldb] [Process/NetBSD] Fix segfault when handling watchpoint

Fix the watchpoint/breakpoint code to search for matching thread entry
in m_threads explicitly rather than assuming that it will be present
at specified index.  The previous code segfault since it wrongly assumed
that the index will match LWP ID which was incorrect even for a single
thread (where index was 0 and LWP ID was 1).

While fixing that off-by-one error would help for this specific task,
I believe it is better to be explicit in what we are searching for.

Differential Revision: https://reviews.llvm.org/D63791

llvm-svn: 364780
  • Loading branch information...
mgorny committed Jul 1, 2019
1 parent 2b2ad93 commit baf64b65056954a887e54e55e4f76f3a12230682
Showing with 21 additions and 10 deletions.
  1. +21 −10 lldb/source/Plugins/Process/NetBSD/NativeProcessNetBSD.cpp
@@ -238,12 +238,25 @@ void NativeProcessNetBSD::MonitorSIGTRAP(lldb::pid_t pid) {
SetState(StateType::eStateStopped, true);
} break;
case TRAP_DBREG: {
// Find the thread.
NativeThreadNetBSD* thread = nullptr;
for (const auto &t : m_threads) {
if (t->GetID() == info.psi_lwpid) {
thread = static_cast<NativeThreadNetBSD *>(t.get());
break;
}
}
if (!thread) {
LLDB_LOG(log,
"thread not found in m_threads, pid = {0}, LWP = {1}",
GetID(), info.psi_lwpid);
break;
}

// If a watchpoint was hit, report it
uint32_t wp_index;
Status error = static_cast<NativeThreadNetBSD &>(*m_threads[info.psi_lwpid])
.GetRegisterContext()
.GetWatchpointHitIndex(
wp_index, (uintptr_t)info.psi_siginfo.si_addr);
uint32_t wp_index = LLDB_INVALID_INDEX32;
Status error = thread->GetRegisterContext().GetWatchpointHitIndex(
wp_index, (uintptr_t)info.psi_siginfo.si_addr);
if (error.Fail())
LLDB_LOG(log,
"received error while checking for watchpoint hits, pid = "
@@ -258,11 +271,9 @@ void NativeProcessNetBSD::MonitorSIGTRAP(lldb::pid_t pid) {
}

// If a breakpoint was hit, report it
uint32_t bp_index;
error = static_cast<NativeThreadNetBSD &>(*m_threads[info.psi_lwpid])
.GetRegisterContext()
.GetHardwareBreakHitIndex(bp_index,
(uintptr_t)info.psi_siginfo.si_addr);
uint32_t bp_index = LLDB_INVALID_INDEX32;
error = thread->GetRegisterContext().GetHardwareBreakHitIndex(
bp_index, (uintptr_t)info.psi_siginfo.si_addr);
if (error.Fail())
LLDB_LOG(log,
"received error while checking for hardware "

0 comments on commit baf64b6

Please sign in to comment.
You can’t perform that action at this time.