From a20bb3e05bac6e3fbeee4920c7d64a9cd3760d9f Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Thu, 7 Sep 2023 04:00:22 +0200 Subject: [PATCH 1/3] Common/MemArena: Assert return value of LazyMemoryRegion::Clear()'s mmap() call. --- Source/Core/Common/MemArenaAndroid.cpp | 4 +++- Source/Core/Common/MemArenaUnix.cpp | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp index 4a9e2f68b4..45b685274b 100644 --- a/Source/Core/Common/MemArenaAndroid.cpp +++ b/Source/Core/Common/MemArenaAndroid.cpp @@ -172,7 +172,9 @@ void LazyMemoryRegion::Clear() { ASSERT(m_memory); - mmap(m_memory, m_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + void* new_memory = mmap(m_memory, m_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + ASSERT(new_memory == m_memory); } void LazyMemoryRegion::Release() diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp index 452c2c50c8..f962da755a 100644 --- a/Source/Core/Common/MemArenaUnix.cpp +++ b/Source/Core/Common/MemArenaUnix.cpp @@ -138,7 +138,9 @@ void LazyMemoryRegion::Clear() { ASSERT(m_memory); - mmap(m_memory, m_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + void* new_memory = mmap(m_memory, m_size, PROT_READ | PROT_WRITE, + MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); + ASSERT(new_memory == m_memory); } void LazyMemoryRegion::Release() From c14bc6ea4c85d823d39d6b49972e0acc493652b0 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Thu, 7 Sep 2023 13:59:33 +0200 Subject: [PATCH 2/3] Common/MemArena: mmap returns MAP_FAILED on error, not nullptr. --- Source/Core/Common/MemArenaAndroid.cpp | 2 +- Source/Core/Common/MemArenaUnix.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp index 45b685274b..3c4b800da8 100644 --- a/Source/Core/Common/MemArenaAndroid.cpp +++ b/Source/Core/Common/MemArenaAndroid.cpp @@ -156,7 +156,7 @@ void* LazyMemoryRegion::Create(size_t size) ASSERT(!m_memory); void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (!memory) + if (memory == MAP_FAILED) { NOTICE_LOG_FMT(MEMMAP, "Memory allocation of {} bytes failed.", size); return nullptr; diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp index f962da755a..ef359de908 100644 --- a/Source/Core/Common/MemArenaUnix.cpp +++ b/Source/Core/Common/MemArenaUnix.cpp @@ -122,7 +122,7 @@ void* LazyMemoryRegion::Create(size_t size) ASSERT(!m_memory); void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - if (!memory) + if (memory == MAP_FAILED) { NOTICE_LOG_FMT(MEMMAP, "Memory allocation of {} bytes failed.", size); return nullptr; From 422bc7a62724643a4d0e92adf857883f73aa9ca6 Mon Sep 17 00:00:00 2001 From: "Admiral H. Curtiss" Date: Thu, 7 Sep 2023 14:41:24 +0200 Subject: [PATCH 3/3] Common/MemArena: A zero-byte allocation is invalid. --- Source/Core/Common/MemArenaAndroid.cpp | 3 +++ Source/Core/Common/MemArenaUnix.cpp | 3 +++ Source/Core/Common/MemArenaWin.cpp | 3 +++ 3 files changed, 9 insertions(+) diff --git a/Source/Core/Common/MemArenaAndroid.cpp b/Source/Core/Common/MemArenaAndroid.cpp index 3c4b800da8..bcba64e1e1 100644 --- a/Source/Core/Common/MemArenaAndroid.cpp +++ b/Source/Core/Common/MemArenaAndroid.cpp @@ -155,6 +155,9 @@ void* LazyMemoryRegion::Create(size_t size) { ASSERT(!m_memory); + if (size == 0) + return nullptr; + void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memory == MAP_FAILED) { diff --git a/Source/Core/Common/MemArenaUnix.cpp b/Source/Core/Common/MemArenaUnix.cpp index ef359de908..9bf3633ee2 100644 --- a/Source/Core/Common/MemArenaUnix.cpp +++ b/Source/Core/Common/MemArenaUnix.cpp @@ -121,6 +121,9 @@ void* LazyMemoryRegion::Create(size_t size) { ASSERT(!m_memory); + if (size == 0) + return nullptr; + void* memory = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (memory == MAP_FAILED) { diff --git a/Source/Core/Common/MemArenaWin.cpp b/Source/Core/Common/MemArenaWin.cpp index ebf078f45b..b147ced53f 100644 --- a/Source/Core/Common/MemArenaWin.cpp +++ b/Source/Core/Common/MemArenaWin.cpp @@ -445,6 +445,9 @@ void* LazyMemoryRegion::Create(size_t size) { ASSERT(!m_memory); + if (size == 0) + return nullptr; + void* memory = VirtualAlloc(nullptr, size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE); if (!memory) {