From 1ae475dae8ea927a659dca762cd3f51b6c894a1c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 26 Jun 2014 12:29:54 +0200 Subject: [PATCH] msvcrt: Fix ungetc on files with empty buffer. --- dlls/msvcrt/file.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c index 70b908ad9b..fe2d144d92 100644 --- a/dlls/msvcrt/file.c +++ b/dlls/msvcrt/file.c @@ -4859,12 +4859,17 @@ int CDECL MSVCRT_printf_s(const char *format, ...) */ int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file) { - if (c == MSVCRT_EOF) + if(!MSVCRT_CHECK_PMT(file != NULL)) return MSVCRT_EOF; + + if (c == MSVCRT_EOF || !(file->_flag&MSVCRT__IOREAD || + (file->_flag&MSVCRT__IORW && !(file->_flag&MSVCRT__IOWRT)))) return MSVCRT_EOF; MSVCRT__lock_file(file); - if(file->_bufsiz == 0 && msvcrt_alloc_buffer(file)) + if((!file->_bufsiz && msvcrt_alloc_buffer(file)) + || (!file->_cnt && file->_ptr==file->_base)) file->_ptr++; + if(file->_ptr>file->_base) { file->_ptr--; if(file->_flag & MSVCRT__IOSTRG) { @@ -4878,6 +4883,7 @@ int CDECL MSVCRT_ungetc(int c, MSVCRT_FILE * file) } file->_cnt++; MSVCRT_clearerr(file); + file->_flag |= MSVCRT__IOREAD; MSVCRT__unlock_file(file); return c; }