Module: wine Branch: master Commit: 1ae475dae8ea927a659dca762cd3f51b6c894a1c URL: http://source.winehq.org/git/wine.git/?a=commit;h=1ae475dae8ea927a659dca762c...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Jun 26 12:29:54 2014 +0200
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 70b908a..fe2d144 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; }