Duane Clark : msvcrt: Fix fread on large buffers in ascii mode.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Oct 27 05:49:26 CDT 2006


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

Author: Duane Clark <fpga at pacbell.net>
Date:   Thu Oct 26 16:28:11 2006 -0700

msvcrt: Fix fread on large buffers in ascii mode.

---

 dlls/msvcrt/file.c       |    3 ++-
 dlls/msvcrt/tests/file.c |   30 ++++++++++++++++++++----------
 2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c
index 146e0f3..1956a7c 100644
--- a/dlls/msvcrt/file.c
+++ b/dlls/msvcrt/file.c
@@ -2550,8 +2550,9 @@ MSVCRT_size_t CDECL MSVCRT_fread(void *p
     }
     pread += i;
     rcnt -= i;
+    ptr = (char *)ptr+i;
     /* expose feof condition in the flags
-     * MFC tests file->_flag for feof, and doesn't not call feof())
+     * MFC tests file->_flag for feof, and doesn't call feof())
      */
     if ( MSVCRT_fdesc[file->_file].wxflag & WX_ATEOF)
         file->_flag |= MSVCRT__IOEOF;
diff --git a/dlls/msvcrt/tests/file.c b/dlls/msvcrt/tests/file.c
index d269765..bd4bd5f 100644
--- a/dlls/msvcrt/tests/file.c
+++ b/dlls/msvcrt/tests/file.c
@@ -139,20 +139,20 @@ static void test_readmode( BOOL ascii_mo
     static const char outbuffer[] = "0,1,2,3,4,5,6,7,8,9\r\n\r\nA,B,C,D,E\r\nX,Y,Z";
     static const char padbuffer[] = "ghjghjghjghj";
     static const char nlbuffer[] = "\r\n";
-    char buffer[MSVCRT_BUFSIZ+256];
+    char buffer[2*MSVCRT_BUFSIZ+256], *optr;
     int fd;
     FILE *file;
-    int i, j, fp, ao, *ip, pl;
+    int i, j, m, fp, ao, *ip, pl;
     long l;
 
     fd = open ("fdopen.tst", O_WRONLY | O_CREAT | O_BINARY, _S_IREAD |_S_IWRITE);
     /* an internal buffer of MSVCRT_BUFSIZ is maintained, so make a file big
      * enough to test operations that cross the buffer boundary 
      */
-    j = (MSVCRT_BUFSIZ-4)/strlen(padbuffer);
+    j = (2*MSVCRT_BUFSIZ-4)/strlen(padbuffer);
     for (i=0; i<j; i++)
         write (fd, padbuffer, strlen(padbuffer));
-    j = (MSVCRT_BUFSIZ-4)%strlen(padbuffer);
+    j = (2*MSVCRT_BUFSIZ-4)%strlen(padbuffer);
     for (i=0; i<j; i++)
         write (fd, &padbuffer[i], 1);
     write (fd, nlbuffer, strlen(nlbuffer));
@@ -173,9 +173,9 @@ static void test_readmode( BOOL ascii_mo
     
     /* first is a test of fgets, ftell, fseek */
     ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
-    ok(fgets(buffer,MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
+    ok(fgets(buffer,2*MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
     l = ftell(file);
-    pl = MSVCRT_BUFSIZ-2;
+    pl = 2*MSVCRT_BUFSIZ-2;
     ok(l == pl,"padding line ftell got %ld should be %d in %s\n", l, pl, IOMODE);
     ok(lstrlenA(buffer) == pl+ao,"padding line fgets got size %d should be %d in %s\n",
      lstrlenA(buffer), pl+ao, IOMODE);
@@ -209,10 +209,20 @@ static void test_readmode( BOOL ascii_mo
     ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
     ok(fgets(buffer,MSVCRT_BUFSIZ-6,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
     j=strlen(outbuffer);
-    i=fread(buffer,1,256,file);
-    ok(i==j+6+ao*4,"fread failed, expected %d got %d in %s\n", j+6+ao*4, i, IOMODE);
+    i=fread(buffer,1,MSVCRT_BUFSIZ+strlen(outbuffer),file);
+    ok(i==MSVCRT_BUFSIZ+j,"fread failed, expected %d got %d in %s\n", MSVCRT_BUFSIZ+j, i, IOMODE);
     l = ftell(file);
-    ok(l == pl+j+1,"ftell after fread got %ld should be %d in %s\n", l, pl+j+1, IOMODE);
+    ok(l == pl+j-(ao*4)-5,"ftell after fread got %ld should be %d in %s\n", l, pl+j-(ao*4)-5, IOMODE);
+    for (m=0; m<3; m++)
+        ok(buffer[m]==padbuffer[m+(MSVCRT_BUFSIZ-4)%strlen(padbuffer)],"expected %c got %c\n", padbuffer[m], buffer[m]);
+    m+=MSVCRT_BUFSIZ+2+ao;
+    optr = (char *)outbuffer;
+    for (; m<i; m++) {
+        ok(buffer[m]==*optr,"char %d expected %c got %c in %s\n", m, *optr, buffer[m], IOMODE);
+        optr++;
+        if (ao && (*optr == '\r'))
+            optr++;
+    }
     /* fread should return the requested number of bytes if available */
     rewind(file);
     ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
@@ -235,7 +245,7 @@ static void test_readmode( BOOL ascii_mo
     /* test some additional functions */
     rewind(file);
     ok(ftell(file) == 0,"Did not start at beginning of file in %s\n", IOMODE);
-    ok(fgets(buffer,MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
+    ok(fgets(buffer,2*MSVCRT_BUFSIZ+256,file) !=0,"padding line fgets failed unexpected in %s\n", IOMODE);
     i = _getw(file);
     ip = (int *)outbuffer;
     ok(i == *ip,"_getw failed, expected %08x got %08x in %s\n", *ip, i, IOMODE);




More information about the wine-cvs mailing list