fix logic error in fread
[musl] / src / stdio / fread.c
index 0fa0b2a..5c23577 100644 (file)
@@ -12,38 +12,26 @@ size_t fread(void *destv, size_t size, size_t nmemb, FILE *f)
 
        FLOCK(f);
 
-       for (;;) {
+       if (f->rend - f->rpos > 0) {
                /* First exhaust the buffer. */
                k = MIN(f->rend - f->rpos, l);
                memcpy(dest, f->rpos, k);
                f->rpos += k;
                dest += k;
                l -= k;
-
-               /* Stop on EOF or errors */
-               if (f->flags & (F_EOF|F_ERR|F_NORD)) goto eof;
-
-               /* Done? Or going unbuffered? */
-               if (!l || l > f->buf_size/2) break;
-
-               /* Otherwise, refill & read thru buffer. */
-               __underflow(f);
        }
-
+       
        /* Read the remainder directly */
        for (; l; l-=k, dest+=k) {
-               k = f->read(f, dest, l);
+               k = __toread(f) ? 0 : f->read(f, dest, l);
                if (k+1<=1) {
-                       f->flags |= F_EOF | (F_ERR & k);
-                       goto eof;
+                       FUNLOCK(f);
+                       return (len-l)/size;
                }
        }
 
        FUNLOCK(f);
        return nmemb;
-eof:
-       FUNLOCK(f);
-       return (len-l)/size;
 }
 
 weak_alias(fread, fread_unlocked);