[Lldb-commits] [lldb] [lldb][windows] bound ReadProcessMemory (PR #200230)
Charles Zablit via lldb-commits
lldb-commits at lists.llvm.org
Mon Jun 1 05:29:35 PDT 2026
================
@@ -614,44 +614,82 @@ static std::optional<std::string> GetFileNameByLoadAddress(HANDLE hProcess,
return dos_path;
}
+// Determine how many bytes can be read at `addr` in `hProcess` before crossing
+// out of the committed memory region containing it. Returns 0 if the address is
+// not within a committed region.
+static SIZE_T BytesReadableAt(HANDLE hProcess, LPCVOID addr) {
+ MEMORY_BASIC_INFORMATION mbi{};
+ if (!::VirtualQueryEx(hProcess, addr, &mbi, sizeof(mbi)))
+ return 0;
+ if (mbi.State != MEM_COMMIT)
+ return 0;
+ uintptr_t region_end =
+ reinterpret_cast<uintptr_t>(mbi.BaseAddress) + mbi.RegionSize;
+ uintptr_t a = reinterpret_cast<uintptr_t>(addr);
+ if (a >= region_end)
+ return 0;
+ return region_end - a;
+}
+
+static std::optional<std::string> ReadRemoteStringW(HANDLE hProcess,
+ LPCVOID addr) {
+ SIZE_T to_read = std::min<SIZE_T>((MAX_PATH + 1) * sizeof(wchar_t),
+ BytesReadableAt(hProcess, addr));
+ to_read &= ~SIZE_T(1); // round down to a wchar_t boundary
+ if (to_read < sizeof(wchar_t))
+ return std::nullopt;
+
+ std::array<wchar_t, MAX_PATH + 1> buf{};
+ SIZE_T bytes_read = 0;
+ if (!::ReadProcessMemory(hProcess, addr, buf.data(), to_read, &bytes_read))
+ return std::nullopt;
+
+ size_t max_chars = bytes_read / sizeof(wchar_t);
+ size_t len = ::wcsnlen(buf.data(), max_chars);
+ if (len == 0 || len == max_chars) // no null terminator found
----------------
charles-zablit wrote:
What I meant was to return `std::nullopt` whether the string is empty or no null terminator were found. I added another if branch to make the intent more explicit.
https://github.com/llvm/llvm-project/pull/200230
More information about the lldb-commits
mailing list