Skip to content

Commit 60898ea

Browse files
Add underflow/overflow checks to GetExpressionEntryAtAddressi
This patch adds explicit checks: - ensure `load_addr >= func_load_addr` to avoid underflow, - compute and verify a temporary delta variable, then verify `delta + m_func_file_addr` does not exceed `addr_t` max to avoid overflow.
1 parent d015971 commit 60898ea

File tree

1 file changed

+11
-3
lines changed

1 file changed

+11
-3
lines changed

lldb/source/Expression/DWARFExpressionList.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,18 @@ DWARFExpressionList::GetExpressionEntryAtAddress(lldb::addr_t func_load_addr,
6464

6565
if (func_load_addr == LLDB_INVALID_ADDRESS)
6666
func_load_addr = m_func_file_addr;
67-
68-
// Translate to file-relative PC.
69-
lldb::addr_t file_pc = load_addr - func_load_addr + m_func_file_addr;
7067

68+
// Guard against underflow when translating a load address back into file space.
69+
if (load_addr < func_load_addr)
70+
return std::nullopt;
71+
72+
// Guard against overflow.
73+
lldb::addr_t delta = load_addr - func_load_addr;
74+
if (delta > std::numeric_limits<lldb::addr_t>::max() - m_func_file_addr)
75+
return std::nullopt;
76+
77+
lldb::addr_t file_pc = (load_addr - func_load_addr) + m_func_file_addr;
78+
7179
if (const auto *entry = m_exprs.FindEntryThatContains(file_pc)) {
7280
AddressRange range_in_file(entry->GetRangeBase(),
7381
entry->GetRangeEnd() - entry->GetRangeBase());

0 commit comments

Comments
 (0)