mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-05 13:20:11 +00:00
On Windows the UCRT does not switch an r+, w+ or a+ stream from writing to reading without fflush or fseek: fread after fwrite returned bytes of the write buffer and the next flush wrote them over the file, and ungetc failed on an update stream that was not already reading. On Linux glibc does not switch either for ungetc, which pushes the byte back over the pending write, drops the write and can corrupt the heap on the next read, or for an fread of at least the buffer size, which drops the write and reads from the old offset. fread, fgetc, getc_unlocked, fgets, ungetc, ungetwc and fscanf now flush pending output and mark the stream as reading first, as FreeBSD 11.4's __srefill and __ungetc do, through _IO_switch_to_get_mode on glibc. Writes directly after reads still go through the UCRT on Windows; the gap is recorded in the libc technical debt.