From: Paul Gofman <pgofman@codeweavers.com> --- dlls/msvcrt/file.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 01853625c23..c096e821b0b 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4147,10 +4147,15 @@ 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; + BOOL no_buffer = FALSE; int written = 0; if (size == 0) return 0; + if(!(file->_flag & (MSVCRT__NOBUF | _IOMYBUF | MSVCRT__USERBUF))) + no_buffer = !msvcrt_alloc_buffer(file); + no_buffer = no_buffer || (file->_flag & MSVCRT__NOBUF); + while(wrcnt) { if(file->_cnt < 0) { WARN("negative file->_cnt value in %p\n", file); @@ -4164,13 +4169,13 @@ 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) + } else if(no_buffer || ((file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= file->_bufsiz) || (!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF)) && wrcnt >= MSVCRT_INTERNAL_BUFSIZ)) { size_t pcnt; int bufsiz; - if(file->_flag & MSVCRT__NOBUF) + if(no_buffer) bufsiz = 1; else if(!(file->_flag & (_IOMYBUF | MSVCRT__USERBUF))) bufsiz = MSVCRT_INTERNAL_BUFSIZ; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10199