summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChia-hung Duan <chiahungduan@google.com>2023-04-14 21:41:19 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-04-14 21:41:19 +0000
commit0fd0e508557e9b3daa8a4708621e7f2c2383b240 (patch)
tree5e6233bfd9f7c1210ca34e309023cfe75ff38515
parentf1ead93bd480918d55734fab097de49b138fed67 (diff)
parent74dbfe7e758a994632cf449a3a0eb5023aa7e7aa (diff)
downloadscudo-0fd0e508557e9b3daa8a4708621e7f2c2383b240.tar.gz
[scudo] The BaseAddr should be MappedBase in releasePagesToOS() am: 74dbfe7e75
Original change: https://android-review.googlesource.com/c/platform/external/scudo/+/2537088 Change-Id: I5c838e443833335ebf62b433f30f6e2c183812b2 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r--standalone/mem_map.cpp17
-rw-r--r--standalone/mem_map.h1
2 files changed, 13 insertions, 5 deletions
diff --git a/standalone/mem_map.cpp b/standalone/mem_map.cpp
index 662d684e509..115cc34e706 100644
--- a/standalone/mem_map.cpp
+++ b/standalone/mem_map.cpp
@@ -19,16 +19,19 @@ bool MemMapDefault::mapImpl(uptr Addr, uptr Size, const char *Name,
if (MappedAddr == nullptr)
return false;
Base = reinterpret_cast<uptr>(MappedAddr);
+ MappedBase = Base;
Capacity = Size;
return true;
}
void MemMapDefault::unmapImpl(uptr Addr, uptr Size) {
if (Size == Capacity) {
- Base = Capacity = 0;
+ Base = MappedBase = Capacity = 0;
} else {
- if (Base == Addr)
+ if (Base == Addr) {
Base = Addr + Size;
+ MappedBase = MappedBase == 0 ? Base : Max(MappedBase, Base);
+ }
Capacity -= Size;
}
@@ -37,13 +40,17 @@ void MemMapDefault::unmapImpl(uptr Addr, uptr Size) {
bool MemMapDefault::remapImpl(uptr Addr, uptr Size, const char *Name,
uptr Flags) {
- void *RemappedAddr =
+ void *RemappedPtr =
::scudo::map(reinterpret_cast<void *>(Addr), Size, Name, Flags, &Data);
- return reinterpret_cast<uptr>(RemappedAddr) == Addr;
+ const uptr RemappedAddr = reinterpret_cast<uptr>(RemappedPtr);
+ MappedBase = MappedBase == 0 ? RemappedAddr : Min(MappedBase, RemappedAddr);
+ return RemappedAddr == Addr;
}
void MemMapDefault::releaseAndZeroPagesToOSImpl(uptr From, uptr Size) {
- return ::scudo::releasePagesToOS(Base, From - Base, Size, &Data);
+ DCHECK_NE(MappedBase, 0U);
+ DCHECK_GE(From, MappedBase);
+ return ::scudo::releasePagesToOS(MappedBase, From - MappedBase, Size, &Data);
}
void MemMapDefault::setMemoryPermissionImpl(uptr Addr, uptr Size, uptr Flags) {
diff --git a/standalone/mem_map.h b/standalone/mem_map.h
index 6179e8aa0aa..0b27fa86c0d 100644
--- a/standalone/mem_map.h
+++ b/standalone/mem_map.h
@@ -47,6 +47,7 @@ public:
private:
uptr Base = 0;
uptr Capacity = 0;
+ uptr MappedBase = 0;
MapPlatformData Data = {};
};