Piotr Caban : msvcrt: Fix ungetc on files with empty buffer.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Jun 26 15:04:51 CDT 2014


Module: wine
Branch: master
Commit: 1ae475dae8ea927a659dca762cd3f51b6c894a1c
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=1ae475dae8ea927a659dca762cd3f51b6c894a1c

Author: Piotr Caban <piotr at 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;
     }




More information about the wine-cvs mailing list