From 1c3ad7ebfdd07759b5615bd2de0c8f7c1dd68914 Mon Sep 17 00:00:00 2001 From: MarcZX10 <67475268+MarcZX10@users.noreply.github.com> Date: Sat, 24 Oct 2026 23:32:51 +0000 Subject: [PATCH 1/2] fix(libc): fail printf_s on a closed standard output with EBADF printf, libc_printf, puts and vprintf return -1 with errno 9 once a failed freopen closed stdout. printf_s wrote to the closed host stream and threw. --- core/libs/prx/libc/src/Formatting.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/libs/prx/libc/src/Formatting.cpp b/core/libs/prx/libc/src/Formatting.cpp index 8fed210247..71ec1c3341 100644 --- a/core/libs/prx/libc/src/Formatting.cpp +++ b/core/libs/prx/libc/src/Formatting.cpp @@ -592,6 +592,7 @@ int APS5_VABI snprintf_s_nid_postfix(char* buffer, size_t size, const char* form } int APS5_VABI printf_s_nid_postfix(const char* format, ...) { + if (!_Stdout_nid_postfix.IsOpen()) { errno = 9; return -1; } __builtin_sysv_va_list args; __builtin_sysv_va_start(args, format); const int result = LibcDetail::PrintWindows(format, args); @@ -632,6 +633,7 @@ int APS5_VABI snprintf_s_nid_postfix(char* buffer, size_t size, const char* form } int APS5_VABI printf_s_nid_postfix(const char* format, ...) { + if (!_Stdout_nid_postfix.IsOpen()) { errno = 9; return -1; } std::va_list args; va_start(args, format); const int result = RequiresGuestFormatting(format) ? LibcDetail::PrintWindows(format, args) : std::vfprintf(GuestStandardOutputFile_nid_no_patch(), format, args); From 2562a7d9d127adba846ef8d34ecce216b696011a Mon Sep 17 00:00:00 2001 From: MarcZX10 <67475268+MarcZX10@users.noreply.github.com> Date: Sat, 24 Oct 2026 23:33:05 +0000 Subject: [PATCH 2/2] test(libc): cover printf_s on a closed standard output --- core/libs/tests/GuestStandardStreams.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/libs/tests/GuestStandardStreams.cpp b/core/libs/tests/GuestStandardStreams.cpp index f2d65cf2a4..c4901e342d 100644 --- a/core/libs/tests/GuestStandardStreams.cpp +++ b/core/libs/tests/GuestStandardStreams.cpp @@ -558,6 +558,10 @@ static int CheckClosedStandardOutput() { Require(printf_nid_postfix("%d", 1) == -1 && *__error_nid_postfix() == 9); Require(puts_nid_postfix("text") == -1 && *__error_nid_postfix() == 9); Require(PrintStandard("%d", 1) == -1 && *__error_nid_postfix() == 9); + *__error_nid_postfix() = 0; + Require(printf_s_nid_postfix("%d", 1) == -1 && *__error_nid_postfix() == 9); + *__error_nid_postfix() = 0; + Require(printf_s_nid_postfix("%p", nullptr) == -1 && *__error_nid_postfix() == 9); Require(fputs_nid_postfix("text", __stdoutp_nid_postfix) == -1 && *__error_nid_postfix() == 9); *__error_nid_postfix() = 0; Require(wprintf_nid_postfix(u"%d", 1) == -1 && *__error_nid_postfix() == 9);