@@ -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