aadsm updated this revision to Diff 203658.
aadsm added a comment.
Fix a little bug and add tests
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D62503/new/
https://reviews.llvm.org/D62503
Files:
lldb/include/lldb/Host/common/NativeProcessProtocol.h
lldb/source/Host/common/NativeProcessProtocol.cpp
lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
lldb/unittests/Host/NativeProcessProtocolTest.cpp
Index: lldb/unittests/Host/NativeProcessProtocolTest.cpp
===================================================================
--- lldb/unittests/Host/NativeProcessProtocolTest.cpp
+++ lldb/unittests/Host/NativeProcessProtocolTest.cpp
@@ -96,3 +96,39 @@
EXPECT_THAT_EXPECTED(Process.ReadMemoryWithoutTrap(4, 2),
llvm::HasValue(std::vector<uint8_t>{4, 5}));
}
+
+TEST(NativeProcessProtocolTest, ReadCStringFromMemory) {
+ NiceMock<MockDelegate> DummyDelegate;
+ MockProcess<NativeProcessProtocol> Process(DummyDelegate,
+ ArchSpec("aarch64-pc-linux"));
+ FakeMemory M{{'h', 'e', 'l', 'l', 'o', 0, 'w', 'o'}};
+ EXPECT_CALL(Process, ReadMemory(_, _))
+ .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
+
+ char string[1024];
+ size_t bytes_read;
+ EXPECT_THAT_ERROR(
+ Process.ReadCStringFromMemory(0x0, &string[0], sizeof(string), bytes_read)
+ .ToError(),
+ llvm::Succeeded());
+ EXPECT_STREQ(string, "hello");
+ EXPECT_EQ(bytes_read, 6UL);
+}
+
+TEST(NativeProcessProtocolTest, ReadCStringFromMemory_MaxSize) {
+ NiceMock<MockDelegate> DummyDelegate;
+ MockProcess<NativeProcessProtocol> Process(DummyDelegate,
+ ArchSpec("aarch64-pc-linux"));
+ FakeMemory M{{'h', 'e', 'l', 'l', 'o', 0, 'w', 'o'}};
+ EXPECT_CALL(Process, ReadMemory(_, _))
+ .WillRepeatedly(Invoke(&M, &FakeMemory::Read));
+
+ char string[4];
+ size_t bytes_read;
+ EXPECT_THAT_ERROR(
+ Process.ReadCStringFromMemory(0x0, &string[0], sizeof(string), bytes_read)
+ .ToError(),
+ llvm::Succeeded());
+ EXPECT_STREQ(string, "hel");
+ EXPECT_EQ(bytes_read, 3UL);
+}
Index: lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
===================================================================
--- lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
+++ lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp
@@ -2090,11 +2090,12 @@
return error;
char name_buffer[PATH_MAX];
- error = ReadMemory(link_map.l_name, &name_buffer, sizeof(name_buffer),
- bytes_read);
+ error = ReadCStringFromMemory(link_map.l_name,
+ reinterpret_cast<char *>(&name_buffer),
+ sizeof(name_buffer), bytes_read);
if (!error.Success())
return error;
- name_buffer[PATH_MAX - 1] = '\0';
+
info.name = std::string(name_buffer);
info.link_map = link_map_addr;
info.base_addr = link_map.l_addr;
Index: lldb/source/Host/common/NativeProcessProtocol.cpp
===================================================================
--- lldb/source/Host/common/NativeProcessProtocol.cpp
+++ lldb/source/Host/common/NativeProcessProtocol.cpp
@@ -16,6 +16,8 @@
#include "lldb/Utility/State.h"
#include "lldb/lldb-enumerations.h"
+#include "llvm/Support/Process.h"
+
using namespace lldb;
using namespace lldb_private;
@@ -659,6 +661,52 @@
return Status();
}
+Status NativeProcessProtocol::ReadCStringFromMemory(lldb::addr_t addr,
+ char *buffer,
+ size_t max_size,
+ size_t &total_bytes_read) {
+ const size_t cache_line_size = llvm::sys::Process::getPageSizeEstimate();
+ size_t bytes_read = 0;
+ size_t bytes_left = max_size;
+ addr_t curr_addr = addr;
+ char *curr_buffer = buffer;
+ total_bytes_read = 0;
+ Status error;
+
+ while (bytes_left > 0 && error.Success()) {
+ addr_t cache_line_bytes_left =
+ cache_line_size - (curr_addr % cache_line_size);
+ addr_t bytes_to_read = std::min<addr_t>(bytes_left, cache_line_bytes_left);
+ error = ReadMemory(curr_addr, reinterpret_cast<void *>(curr_buffer),
+ bytes_to_read, bytes_read);
+
+ if (bytes_read == 0)
+ break;
+
+ auto str_end = std::memchr(curr_buffer, '\0', bytes_read);
+ if (str_end != NULL) {
+ total_bytes_read =
+ (size_t)(reinterpret_cast<char *>(str_end) - buffer + 1);
+ error.Clear();
+ break;
+ }
+
+ total_bytes_read += bytes_read;
+ curr_buffer += bytes_read;
+ curr_addr = reinterpret_cast<addr_t>(reinterpret_cast<char *>(curr_addr) +
+ bytes_read);
+ bytes_left -= bytes_read;
+ }
+
+ // Make sure we return a null terminated string.
+ if (bytes_left == 0 && buffer[max_size - 1] != '\0') {
+ buffer[max_size - 1] = '\0';
+ total_bytes_read--;
+ }
+
+ return error;
+}
+
lldb::StateType NativeProcessProtocol::GetState() const {
std::lock_guard<std::recursive_mutex> guard(m_state_mutex);
return m_state;
Index: lldb/include/lldb/Host/common/NativeProcessProtocol.h
===================================================================
--- lldb/include/lldb/Host/common/NativeProcessProtocol.h
+++ lldb/include/lldb/Host/common/NativeProcessProtocol.h
@@ -83,6 +83,9 @@
Status ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size,
size_t &bytes_read);
+ Status ReadCStringFromMemory(lldb::addr_t addr, char *buffer, size_t max_size,
+ size_t &total_bytes_read);
+
virtual Status WriteMemory(lldb::addr_t addr, const void *buf, size_t size,
size_t &bytes_written) = 0;
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits