Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: util/win/process_info_test.cc

Issue 1370063005: MEM_RESERVE regions are not accessible by ReadProcessMemory() (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: add real-world test Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « util/win/process_info.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: util/win/process_info_test.cc
diff --git a/util/win/process_info_test.cc b/util/win/process_info_test.cc
index d3d674dd875ad10131145d151731abde57776915..1017c7d5a91c028a6590c222932f7b2ea362eafc 100644
--- a/util/win/process_info_test.cc
+++ b/util/win/process_info_test.cc
@@ -19,6 +19,7 @@
#include <wchar.h>
#include "base/files/file_path.h"
+#include "base/memory/scoped_ptr.h"
#include "build/build_config.h"
#include "gtest/gtest.h"
#include "test/paths.h"
@@ -279,6 +280,29 @@ TEST(ProcessInfo, AccessibleRangesOneMovedStart) {
EXPECT_EQ(5, result[0].size());
}
+TEST(ProcessInfo, ReserveIsInaccessible) {
+ std::vector<ProcessInfo::MemoryInfo> memory_info;
+ MEMORY_BASIC_INFORMATION mbi = {0};
+
+ mbi.BaseAddress = 0;
+ mbi.RegionSize = 10;
+ mbi.State = MEM_RESERVE;
+ memory_info.push_back(ProcessInfo::MemoryInfo(mbi));
+
+ mbi.BaseAddress = reinterpret_cast<void*>(10);
+ mbi.RegionSize = 20;
+ mbi.State = MEM_COMMIT;
+ memory_info.push_back(ProcessInfo::MemoryInfo(mbi));
+
+ std::vector<CheckedRange<WinVMAddress, WinVMSize>> result =
+ GetReadableRangesOfMemoryMap(CheckedRange<WinVMAddress, WinVMSize>(5, 10),
+ memory_info);
+
+ ASSERT_EQ(result.size(), 1u);
+ EXPECT_EQ(10, result[0].base());
+ EXPECT_EQ(5, result[0].size());
+}
+
TEST(ProcessInfo, AccessibleRangesCoalesced) {
std::vector<ProcessInfo::MemoryInfo> memory_info;
MEMORY_BASIC_INFORMATION mbi = {0};
@@ -295,7 +319,7 @@ TEST(ProcessInfo, AccessibleRangesCoalesced) {
mbi.BaseAddress = reinterpret_cast<void*>(12);
mbi.RegionSize = 5;
- mbi.State = MEM_RESERVE;
+ mbi.State = MEM_COMMIT;
memory_info.push_back(ProcessInfo::MemoryInfo(mbi));
std::vector<CheckedRange<WinVMAddress, WinVMSize>> result =
@@ -373,6 +397,72 @@ TEST(ProcessInfo, RequestedAfterMap) {
EXPECT_EQ(5, result[0].size());
}
+TEST(ProcessInfo, ReadableRanges) {
+ ProcessInfo info;
Mark Mentovai 2015/10/01 21:43:52 Don’t declare this until you use it below.
scottmg 2015/10/01 22:03:49 Done.
+
+ SYSTEM_INFO system_info;
+ GetSystemInfo(&system_info);
+
+ const size_t kBlockSize = system_info.dwPageSize;
+
+ // Allocate 6 pages, and then commit the second, fourth, and fifth, so we have
+ // a setup like this:
+ // 0 1 2 3 4 5
+ // +-----------------------------------------------+
+ // | ????? | | ????? | | | ????? |
Mark Mentovai 2015/10/01 21:43:52 Maybe page[2] should be PAGE_NOACCESS to test that
scottmg 2015/10/01 22:03:49 Sadly, I screwed that three line function up when
Mark Mentovai 2015/10/01 22:22:28 scottmg wrote:
+ // +-----------------------------------------------+
+ void* reserve_region =
+ VirtualAlloc(nullptr, kBlockSize * 6, MEM_RESERVE, PAGE_READWRITE);
+ ASSERT_TRUE(reserve_region);
+ uintptr_t reserved_as_int = reinterpret_cast<uintptr_t>(reserve_region);
+ void* readable1 =
+ VirtualAlloc(reinterpret_cast<void*>(reserved_as_int + kBlockSize),
+ kBlockSize,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ASSERT_TRUE(readable1);
+ void* readable2 =
+ VirtualAlloc(reinterpret_cast<void*>(reserved_as_int + (kBlockSize * 3)),
+ kBlockSize * 2,
+ MEM_COMMIT,
+ PAGE_READWRITE);
+ ASSERT_TRUE(readable2);
+
+ info.Initialize(GetCurrentProcess());
Mark Mentovai 2015/10/01 21:43:52 You call GetCurrentProcess() five times in this te
scottmg 2015/10/01 22:03:49 Sure, it's just "return -1", but I guess it means
+ auto ranges = info.GetReadableRanges(
+ CheckedRange<WinVMAddress, WinVMSize>(reserved_as_int, kBlockSize * 6));
+
+ ASSERT_EQ(ranges.size(), 2u);
Mark Mentovai 2015/10/01 21:43:52 Order as (2u, ranges.size()).
scottmg 2015/10/01 22:03:49 Done.
+ EXPECT_EQ(reserved_as_int + kBlockSize, ranges[0].base());
+ EXPECT_EQ(kBlockSize, ranges[0].size());
+ EXPECT_EQ(reserved_as_int + (kBlockSize * 3), ranges[1].base());
+ EXPECT_EQ(kBlockSize * 2, ranges[1].size());
+
+ // Also make sure what we think we can read corresponds with what we can
+ // actually read.
+ scoped_ptr<unsigned char[]> into(new unsigned char[kBlockSize * 6]);
+ SIZE_T bytes_read;
+
+ EXPECT_TRUE(ReadProcessMemory(
+ GetCurrentProcess(), readable1, into.get(), kBlockSize, &bytes_read));
+ EXPECT_EQ(kBlockSize, bytes_read);
+
+ EXPECT_TRUE(ReadProcessMemory(
+ GetCurrentProcess(), readable2, into.get(), kBlockSize * 2, &bytes_read));
+ EXPECT_EQ(kBlockSize * 2, bytes_read);
+
+ EXPECT_FALSE(ReadProcessMemory(GetCurrentProcess(),
+ reserve_region,
+ into.get(),
+ kBlockSize,
+ &bytes_read));
+ EXPECT_FALSE(ReadProcessMemory(GetCurrentProcess(),
+ reserve_region,
+ into.get(),
+ kBlockSize * 6,
+ &bytes_read));
+}
+
} // namespace
} // namespace test
} // namespace crashpad
« no previous file with comments | « util/win/process_info.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698