[PATCH v2 0/1] MR10199: msvcrt: Fix no buffering detection in _fwrite_nolock().
-- v2: msvcrt: Fix no buffering detection in _fwrite_nolock(). https://gitlab.winehq.org/wine/wine/-/merge_requests/10199
From: Paul Gofman <pgofman@codeweavers.com> --- dlls/msvcrt/file.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 01853625c23..d999996e7d6 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4147,10 +4147,14 @@ size_t CDECL fwrite(const void *ptr, size_t size, size_t nmemb, FILE* file) size_t CDECL _fwrite_nolock(const void *ptr, size_t size, size_t nmemb, FILE* file) { size_t wrcnt=size * nmemb; - int written = 0; + int written = 0, bufsize = 1; if (size == 0) return 0; + if (((file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF)) || msvcrt_alloc_buffer(file)) + && (file->_flag & (_IOMYBUF | MSVCRT__USERBUF))) + bufsize = file->_bufsiz; + while(wrcnt) { if(file->_cnt < 0) { WARN("negative file->_cnt value in %p\n", file); @@ -4164,20 +4168,9 @@ size_t CDECL _fwrite_nolock(const void *ptr, size_t size, size_t nmemb, FILE* fi written += pcnt; wrcnt -= pcnt; ptr = (const char*)ptr + pcnt; - } else if((file->_flag & MSVCRT__NOBUF) - || ((file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= file->_bufsiz) - || (!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= MSVCRT_INTERNAL_BUFSIZ)) { + } else if(wrcnt >= bufsize) { size_t pcnt; - int bufsiz; - - if(file->_flag & MSVCRT__NOBUF) - bufsiz = 1; - else if(!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF))) - bufsiz = MSVCRT_INTERNAL_BUFSIZ; - else - bufsiz = file->_bufsiz; - - pcnt = (wrcnt / bufsiz) * bufsiz; + pcnt = (wrcnt / bufsize) * bufsize; if(msvcrt_flush_buffer(file) == EOF) break; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10199
v2: - simplify expressions and get bufsize before the loop. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10199#note_130734
On Fri Feb 27 16:24:33 2026 +0000, Piotr Caban wrote:
Yes, but when it sets IOMYBUF or NOBUF (and returns TRUE) it also sets file-\>\_bufsiz. I don't see anything wrong in proposed change. Well, yes, It may in theory set _NOBUF and bufsiz to 2 and we probably still want to treat that as bufferred write instead of going byte by byte to flsbuf. I will update v2.
-- https://gitlab.winehq.org/wine/wine/-/merge_requests/10199#note_130735
participants (2)
-
Paul Gofman -
Paul Gofman (@gofman)