Dan Kegel : msvcrt: _flsbuf zeroes _cnt.

Alexandre Julliard julliard at winehq.org
Thu Jan 29 09:14:52 CST 2009


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

Author: Dan Kegel <dank at kegel.com>
Date:   Wed Jan 28 21:42:01 2009 -0800

msvcrt: _flsbuf zeroes _cnt.

---

 dlls/msvcrt/file.c       |    2 ++
 dlls/msvcrt/tests/file.c |   23 ++++++++++++++++++++++-
 2 files changed, 24 insertions(+), 1 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index ed23d02..2740cfa 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2592,6 +2592,8 @@ int CDECL MSVCRT__flsbuf(int c, MSVCRT_FILE* file)
   } else {
 	unsigned char cc=c;
         int len;
+        /* set _cnt to 0 for unbuffered FILEs */
+        file->_cnt = 0;
 	len = MSVCRT__write(file->_file, &cc, 1);
         if (len == 1) return c & 0xff;
         file->_flag |= MSVCRT__IOERR;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index b783b51..3c8844b 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -471,9 +471,10 @@ static void test_flsbuf( void )
 {
   char* tempf;
   FILE *tempfh;
+  int  c;
   int  ret;
   int  bufmode;
-  int  bufmodes[] = {_IOFBF,_IONBF};
+  static const int bufmodes[] = {_IOFBF,_IONBF};
 
   tempf=_tempnam(".","wne");
   for (bufmode=0; bufmode < sizeof(bufmodes)/sizeof(bufmodes[0]); bufmode++)
@@ -497,6 +498,26 @@ static void test_flsbuf( void )
   ok(EOF == ret, "_flsbuf(0,tempfh) on r/o file expected %x got %x\n", EOF, ret);
   fclose(tempfh);
 
+  /* See bug 17123, exposed by WinAVR's make */
+  tempfh = fopen(tempf,"w");
+  ok(tempfh->_cnt == 0, "_cnt on freshly opened file was %d\n", tempfh->_cnt);
+  setbuf(tempfh, NULL);
+  ok(tempfh->_cnt == 0, "_cnt on unbuffered file was %d\n", tempfh->_cnt);
+  /* Inlined putchar sets _cnt to -1.  Native seems to ignore the value... */
+  tempfh->_cnt = 1234;
+  ret = _flsbuf('Q',tempfh);
+  ok('Q' == ret, "_flsbuf('Q',tempfh) expected %x got %x\n", 'Q', ret);
+  /* ... and reset it to zero */
+  ok(tempfh->_cnt == 0, "after unbuf _flsbuf, _cnt was %d\n", tempfh->_cnt);
+  fclose(tempfh);
+  /* And just for grins, make sure the file is correct */
+  tempfh = fopen(tempf,"r");
+  c = fgetc(tempfh);
+  ok(c == 'Q', "first byte should be 'Q'\n");
+  c = fgetc(tempfh);
+  ok(c == EOF, "there should only be one byte\n");
+  fclose(tempfh);
+
   unlink(tempf);
 }
 




More information about the wine-cvs mailing list