From: Piotr Caban Subject: [PATCH] msvcrt: Reset buffer in fflush on error. Message-Id: <52a84613-af82-4c4d-6d63-a84c14faf41b@codeweavers.com> Date: Fri, 12 Jun 2020 12:43:00 +0200 Signed-off-by: Piotr Caban --- dlls/msvcrt/file.c | 11 ++++++----- dlls/msvcrt/tests/file.c | 18 +++++++++++++++++- 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 825d442bfa..6b7471a56a 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -656,21 +656,22 @@ void msvcrt_init_io(void) /* INTERNAL: Flush stdio file buffer */ static int msvcrt_flush_buffer(MSVCRT_FILE* file) { + int ret = 0; + if((file->_flag & (MSVCRT__IOREAD|MSVCRT__IOWRT)) == MSVCRT__IOWRT && file->_flag & (MSVCRT__IOMYBUF|MSVCRT__USERBUF)) { int cnt=file->_ptr-file->_base; if(cnt>0 && MSVCRT__write(file->_file, file->_base, cnt) != cnt) { file->_flag |= MSVCRT__IOERR; - return MSVCRT_EOF; - } - - if(file->_flag & MSVCRT__IORW) + ret = MSVCRT_EOF; + } else if(file->_flag & MSVCRT__IORW) { file->_flag &= ~MSVCRT__IOWRT; + } } file->_ptr=file->_base; file->_cnt=0; - return 0; + return ret; } /********************************************************************* diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c index 61f6ffe373..fc6dacd71f 100644 --- a/dlls/msvcrt/tests/file.c +++ b/dlls/msvcrt/tests/file.c @@ -687,7 +687,7 @@ static void test_fflush( void ) char buf1[16], buf2[24]; char *tempf; FILE *tempfh; - int ret; + int ret, fd; tempf=_tempnam(".","wne"); @@ -728,7 +728,23 @@ static void test_fflush( void ) ok(memcmp(buf1, buf2, sizeof(buf1)) == 0, "Got unexpected data (%c)\n", buf2[0]); fclose(tempfh); + unlink(tempf); + + /* test flush failure */ + tempfh = fopen(tempf,"wb"); + ok(tempfh != NULL, "Can't open test file.\n"); + fwrite(obuf, 1, sizeof(obuf), tempfh); + fd = tempfh->_file; + tempfh->_file = -1; + + ok(tempfh->_ptr - tempfh->_base, "buffer is empty\n"); + ret = fflush(tempfh); + ok(ret == EOF, "expected EOF, got %d\n", ret); + ok(!(tempfh->_ptr - tempfh->_base), "buffer should be empty\n"); + ok(!tempfh->_cnt, "tempfh->_cnt = %d\n", tempfh->_cnt); + tempfh->_file = fd; + fclose(tempfh); unlink(tempf); free(tempf); }