From cf013fdc158cd9d70c55a9ba6ac7c9b5258cf08c Mon Sep 17 00:00:00 2001 From: "Herman S." <429230+has207@users.noreply.github.com> Date: Thu, 26 Mar 2026 23:04:27 +0900 Subject: [PATCH] [Base/Posix] mapped_memory portability and correctness fixes Replace Linux-specific fstat64/ftruncate64 with portable POSIX equivalents. Fix mmap error check to use MAP_FAILED instead of null pointer comparison. Remove unconditional ftruncate after mmap that could corrupt files. Add zero-length guard. --- src/xenia/base/mapped_memory_posix.cc | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/src/xenia/base/mapped_memory_posix.cc b/src/xenia/base/mapped_memory_posix.cc index ddedf0f17..db6507564 100644 --- a/src/xenia/base/mapped_memory_posix.cc +++ b/src/xenia/base/mapped_memory_posix.cc @@ -46,20 +46,26 @@ class PosixMappedMemory : public MappedMemory { break; } + struct stat file_stat; + if (fstat(file_descriptor, &file_stat)) { + close(file_descriptor); + return nullptr; + } + uint64_t file_size = uint64_t(file_stat.st_size); + size_t map_length = length; if (!length) { - struct stat64 file_stat; - if (fstat64(file_descriptor, &file_stat)) { - close(file_descriptor); - return nullptr; - } - map_length = size_t(file_stat.st_size); + map_length = size_t(file_size); + } + + if (!map_length) { + close(file_descriptor); + return nullptr; } void* data = mmap(0, map_length, protection, MAP_SHARED, file_descriptor, offset); - ftruncate(file_descriptor, map_length); - if (!data) { + if (data == MAP_FAILED) { close(file_descriptor); return nullptr; } @@ -75,7 +81,7 @@ class PosixMappedMemory : public MappedMemory { } if (file_descriptor_ >= 0) { if (truncate_size) { - ftruncate64(file_descriptor_, off64_t(truncate_size)); + ftruncate(file_descriptor_, truncate_size); } close(file_descriptor_); file_descriptor_ = -1;