https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=dcb12dd6dd9fcabda723184ac0c94d6fd3d920f8
commit dcb12dd6dd9fcabda723184ac0c94d6fd3d920f8 Author: Corinna Vinschen <cori...@vinschen.de> AuthorDate: Tue Apr 8 15:54:42 2025 +0200 Commit: Corinna Vinschen <cori...@vinschen.de> CommitDate: Tue Apr 8 16:06:40 2025 +0200 Cygwin: fhandler_base::open: move O_TRUNC comment into O_TRUNC case Signed-off-by: Corinna Vinschen <cori...@vinschen.de> (cherry picked from commit 9e6193576f341f1d1a8caefb7a4ae4b7b5407e74) Diff: --- winsup/cygwin/fhandler/base.cc | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/winsup/cygwin/fhandler/base.cc b/winsup/cygwin/fhandler/base.cc index 36d814bf3543..32aca2c51a62 100644 --- a/winsup/cygwin/fhandler/base.cc +++ b/winsup/cygwin/fhandler/base.cc @@ -769,18 +769,17 @@ fhandler_base::open (int flags, mode_t mode) set_created_file_access (fh, pc, mode); } - /* If you O_TRUNC a file on Linux, the data is truncated, but the EAs are - preserved. If you open a file on Windows with FILE_OVERWRITE{_IF} or - FILE_SUPERSEDE, all streams are truncated, including the EAs. So we don't - use the FILE_OVERWRITE{_IF} flags, but instead just open the file and set - the size of the data stream explicitely to 0. Apart from being more Linux - compatible, this implementation has the pleasant side-effect to be more - than 5% faster than using FILE_OVERWRITE{_IF} (tested on W7 32 bit). */ if ((flags & O_TRUNC) && (flags & O_ACCMODE) != O_RDONLY && io.Information != FILE_CREATED && get_device () == FH_FS) { + /* If you O_TRUNC a file on Linux, the data is truncated, but the EAs are + preserved. If you open a file on Windows with FILE_OVERWRITE{_IF} or + FILE_SUPERSEDE, all streams are truncated, including the EAs. So we + don't use FILE_OVERWRITE{_IF} but just open the file and truncate the + data stream to size 0. Apart from being more Linux compatible, this + has the pleasant side-effect to be more than 5% faster. */ FILE_END_OF_FILE_INFORMATION feofi = { EndOfFile:{ QuadPart:0 } }; status = NtSetInformationFile (fh, &io, &feofi, sizeof feofi, FileEndOfFileInformation);