From fdf288f3fc511e45319b8ecde855bad62819e7b5 Mon Sep 17 00:00:00 2001 From: MarcZX100 Date: Thu, 8 Oct 2026 16:00:16 +0000 Subject: [PATCH] fix(libc): return fclose failures to callers (cherry picked from commit 610d6cdda098e9adfcd3814b52f8eba01caaa4d1) --- core/libs/prx/libc/include/FileStream.hpp | 5 +++-- core/libs/prx/libc/src/FileAndHeap.cpp | 3 +-- core/libs/tests/GuestFiopen.cpp | 8 ++++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/core/libs/prx/libc/include/FileStream.hpp b/core/libs/prx/libc/include/FileStream.hpp index 7a1b467be..0332062df 100644 --- a/core/libs/prx/libc/include/FileStream.hpp +++ b/core/libs/prx/libc/include/FileStream.hpp @@ -122,11 +122,12 @@ public: SyncStatus(); } - void Close() { + int Close() { GetHandle(); - if (std::fclose(std::exchange(_handle, nullptr)) != 0) throw std::runtime_error("FileStream: close failed"); + const int result = std::fclose(std::exchange(_handle, nullptr)); _guest.flags = 0; _guest.descriptor = -1; + return result; } }; static_assert(std::is_standard_layout_v); diff --git a/core/libs/prx/libc/src/FileAndHeap.cpp b/core/libs/prx/libc/src/FileAndHeap.cpp index 20527e876..834692101 100644 --- a/core/libs/prx/libc/src/FileAndHeap.cpp +++ b/core/libs/prx/libc/src/FileAndHeap.cpp @@ -146,8 +146,7 @@ int APS5_VABI fopen_s_nid_postfix(FileStream** result, const char* filename, con int APS5_VABI fclose_nid_postfix(FileStream* stream) { GetNativeStream(stream); std::unique_ptr owner(stream->IsDynamic() ? stream : nullptr); - stream->Close(); - return 0; + return stream->Close(); } int APS5_VABI fseek_nid_postfix(FileStream* stream, std::int64_t offset, int origin); diff --git a/core/libs/tests/GuestFiopen.cpp b/core/libs/tests/GuestFiopen.cpp index 6c2636ae3..99dcbb5aa 100644 --- a/core/libs/tests/GuestFiopen.cpp +++ b/core/libs/tests/GuestFiopen.cpp @@ -131,6 +131,14 @@ int main() { Require(stream != nullptr && std::fgetc(stream->GetHandle()) == 'k'); fclose_nid_postfix(stream); +#ifndef _WIN32 + auto* full = std::fopen("/dev/full", "wb"); + Require(full != nullptr); + auto* fullStream = new FileStream(full, true); + Require(std::fwrite("buffered", 1, 8, full) == 8); + Require(fclose_nid_postfix(fullStream) == EOF); +#endif + std::filesystem::remove_all(dir); return 0; }