From 855e51f3f853f48bfc00c385a5253f57b75133fe Mon Sep 17 00:00:00 2001 From: 1e1 <1e1@users.noreply.github.com> Date: Tue, 30 Jun 2026 08:14:31 +0200 Subject: [PATCH] Common/coreinit: fix Unix mmap failure detection and other robustness issues - MemMapperUnix: mmap returns MAP_FAILED (not NULL) on failure; translate it to nullptr so the existing '!ptr' checks in the memory backend actually detect a failed reservation. - coreinit: bound writes to the fixed 256-entry active-thread array. - betype: operator|(betype) returned a reference to a local temporary; return by value like the sibling overload. --- src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp | 9 +++++++-- src/Common/betype.h | 2 +- src/util/MemMapper/MemMapperUnix.cpp | 7 ++++++- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp b/src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp index 52dc0318..f4455b0e 100644 --- a/src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp +++ b/src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp @@ -154,8 +154,13 @@ namespace coreinit } if (alreadyActive == false) { - activeThread[activeThreadCount] = threadMPTR; - activeThreadCount++; + if (activeThreadCount < 256) + { + activeThread[activeThreadCount] = threadMPTR; + activeThreadCount++; + } + else + cemuLog_log(LogType::Force, "coreinit: active thread list is full, cannot register thread"); } __OSCreateHostThread(thread); diff --git a/src/Common/betype.h b/src/Common/betype.h index 501ee980..3b46207f 100644 --- a/src/Common/betype.h +++ b/src/Common/betype.h @@ -157,7 +157,7 @@ public: return *this; } - betype& operator|(const betype& v) const requires (requires (T& x, const T& y) { x | y; }) + betype operator|(const betype& v) const requires (requires (T& x, const T& y) { x | y; }) { betype tmp(*this); tmp.m_value = tmp.m_value | v.m_value; diff --git a/src/util/MemMapper/MemMapperUnix.cpp b/src/util/MemMapper/MemMapperUnix.cpp index 8e800e53..b676754b 100644 --- a/src/util/MemMapper/MemMapperUnix.cpp +++ b/src/util/MemMapper/MemMapperUnix.cpp @@ -32,7 +32,8 @@ namespace MemMapper void* ReserveMemory(void* baseAddr, size_t size, PAGE_PERMISSION permissionFlags) { - return mmap(baseAddr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + void* r = mmap(baseAddr, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + return r == MAP_FAILED ? nullptr : r; } void FreeReservation(void* baseAddr, size_t size) @@ -55,7 +56,11 @@ namespace MemMapper r = nullptr; } else + { r = mmap(baseAddr, size, GetProt(permissionFlags), MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + if (r == MAP_FAILED) + r = nullptr; + } return r; }