Skip to content

Commit 1b470fb

Browse files
fixup! add death tests
1 parent d498717 commit 1b470fb

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

lldb/source/Target/Process.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1978,7 +1978,7 @@ Process::ReadMemoryRanges(llvm::ArrayRef<Range<lldb::addr_t, size_t>> ranges,
19781978
llvm::map_range(ranges, [](auto range) { return range.size; }));
19791979
// If the buffer is not large enough, this is a programmer error.
19801980
// In production builds, gracefully fail by returning empty chunks.
1981-
assert(buffer.size() >= total_ranges_len);
1981+
assert(buffer.size() >= total_ranges_len && "provided buffer is too short");
19821982
if (buffer.size() < total_ranges_len) {
19831983
llvm::MutableArrayRef<uint8_t> empty;
19841984
return {ranges.size(), empty};

lldb/unittests/Target/MemoryTest.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,11 +236,14 @@ class DummyReaderProcess : public Process {
236236
// Process::ReadMemoryFromInferior tries to fulfill the entire request by
237237
// reading smaller chunks until it gets nothing back.
238238
bool read_less_than_requested = false;
239+
bool read_more_than_requested = false;
239240

240241
size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
241242
Status &error) override {
242243
if (read_less_than_requested && size > 0)
243244
size--;
245+
if (read_more_than_requested)
246+
size *= 2;
244247
uint8_t *buffer = static_cast<uint8_t *>(buf);
245248
for (size_t addr = vm_addr; addr < vm_addr + size; addr++)
246249
buffer[addr - vm_addr] = static_cast<uint8_t>(addr); // LSB of addr.
@@ -308,3 +311,45 @@ TEST_F(MemoryTest, TestReadMemoryRanges) {
308311
}
309312
}
310313
}
314+
315+
using MemoryDeathTest = MemoryTest;
316+
317+
TEST_F(MemoryDeathTest, TestReadMemoryRangesReturnsTooMuch) {
318+
ArchSpec arch("x86_64-apple-macosx-");
319+
Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch));
320+
DebuggerSP debugger_sp = Debugger::CreateInstance();
321+
ASSERT_TRUE(debugger_sp);
322+
TargetSP target_sp = CreateTarget(debugger_sp, arch);
323+
ASSERT_TRUE(target_sp);
324+
ListenerSP listener_sp(Listener::MakeListener("dummy"));
325+
ProcessSP process_sp =
326+
std::make_shared<DummyReaderProcess>(target_sp, listener_sp);
327+
ASSERT_TRUE(process_sp);
328+
329+
auto &dummy_process = static_cast<DummyReaderProcess &>(*process_sp);
330+
dummy_process.read_more_than_requested = true;
331+
llvm::SmallVector<uint8_t, 0> buffer(1024, 0);
332+
llvm::SmallVector<Range<addr_t, size_t>> ranges = {{0x12345, 128}};
333+
ASSERT_DEATH(
334+
{ process_sp->ReadMemoryRanges(ranges, buffer); },
335+
"read more than requested bytes");
336+
}
337+
338+
TEST_F(MemoryDeathTest, TestReadMemoryRangesWithShortBuffer) {
339+
ArchSpec arch("x86_64-apple-macosx-");
340+
Platform::SetHostPlatform(PlatformRemoteMacOSX::CreateInstance(true, &arch));
341+
DebuggerSP debugger_sp = Debugger::CreateInstance();
342+
ASSERT_TRUE(debugger_sp);
343+
TargetSP target_sp = CreateTarget(debugger_sp, arch);
344+
ASSERT_TRUE(target_sp);
345+
ListenerSP listener_sp(Listener::MakeListener("dummy"));
346+
ProcessSP process_sp =
347+
std::make_shared<DummyReaderProcess>(target_sp, listener_sp);
348+
ASSERT_TRUE(process_sp);
349+
350+
llvm::SmallVector<uint8_t, 0> too_short_buffer(10, 0);
351+
llvm::SmallVector<Range<addr_t, size_t>> ranges = {{0x12345, 128}};
352+
ASSERT_DEATH(
353+
{ process_sp->ReadMemoryRanges(ranges, too_short_buffer); },
354+
"provided buffer is too short");
355+
}

0 commit comments

Comments
 (0)