diff options
author | Chia-hung Duan <chiahungduan@google.com> | 2023-04-14 21:41:19 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-04-14 21:41:19 +0000 |
commit | 0fd0e508557e9b3daa8a4708621e7f2c2383b240 (patch) | |
tree | 5e6233bfd9f7c1210ca34e309023cfe75ff38515 | |
parent | f1ead93bd480918d55734fab097de49b138fed67 (diff) | |
parent | 74dbfe7e758a994632cf449a3a0eb5023aa7e7aa (diff) | |
download | scudo-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.cpp | 17 | ||||
-rw-r--r-- | standalone/mem_map.h | 1 |
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 = {}; }; |