Browse Source

Fix fread bug reported by Vodz. The fix is straightforward, but I haven't
tested it (lack of time).

Manuel Novoa III 24 years ago
parent
commit
5838c4acc0
1 changed files with 13 additions and 11 deletions
  1. 13 11
      libc/stdio/stdio.c

+ 13 - 11
libc/stdio/stdio.c

@@ -423,17 +423,19 @@ off_t _uClibc_fread(unsigned char *buf, off_t bytes, FILE *fp)
 			goto FROM_BUF;
 		}
 
-	TRY_READ:
-		len = read(fp->fd, p, (unsigned) bytes);
-		if (len < 0) {
-			if (errno == EINTR) { /* We were interrupted, so try again. */
-				goto TRY_READ;
-			}
-			fp->mode |= __MODE_ERR;
-		} else {
-			p += len;
-			if (len == 0) {
-				fp->mode |= __MODE_EOF;
+		while (bytes) {
+			if ((len = read(fp->fd, p, (unsigned) bytes)) < 0) {
+				if (errno != EINTR) { /* We weren't interrupted, so error. */
+					fp->mode |= __MODE_ERR;
+					break;
+				}
+			} else {
+				if (len == 0) {
+					fp->mode |= __MODE_EOF;
+					break;
+				}
+				bytes -= len;
+				p += len;
 			}
 		}
 	}