Merge pull request #3926 from MarcZX100/codex/carry-fclose-error

fix(libc): return fclose failures to callers
This commit is contained in:
Dean 2026-10-13 01:24:43 +13:00 committed by GitHub
commit 029c1bc17d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 12 additions and 4 deletions

View File

@ -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<FileStream>);

View File

@ -186,8 +186,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<FileStream> 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);

View File

@ -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;
}