Issue #1706039: Support continued reading from a file even after
EOF was hit.
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 565bf5c..5b76b0d 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -861,16 +861,16 @@
 			  buffersize - bytesread, f->f_fp, (PyObject *)f);
 		Py_END_ALLOW_THREADS
 		if (chunksize == 0) {
-			if (!ferror(f->f_fp))
+			if (!PyErr_ExceptionMatches(PyExc_IOError))
 				break;
-			clearerr(f->f_fp);
 			/* When in non-blocking mode, data shouldn't
 			 * be discarded if a blocking signal was
 			 * received. That will also happen if
 			 * chunksize != 0, but bytesread < buffersize. */
-			if (bytesread > 0 && BLOCKED_ERRNO(errno))
+			if (bytesread > 0 && BLOCKED_ERRNO(errno)) {
+				PyErr_Clear();
 				break;
-			PyErr_SetFromErrno(PyExc_IOError);
+			}
 			Py_DECREF(v);
 			return NULL;
 		}
@@ -917,10 +917,8 @@
 						(PyObject *)f);
 		Py_END_ALLOW_THREADS
 		if (nnow == 0) {
-			if (!ferror(f->f_fp))
+			if (!PyErr_ExceptionMatches(PyExc_IOError))
 				break;
-			PyErr_SetFromErrno(PyExc_IOError);
-			clearerr(f->f_fp);
 			return NULL;
 		}
 		ndone += nnow;
@@ -1412,10 +1410,8 @@
 		}
 		if (nread == 0) {
 			sizehint = 0;
-			if (!ferror(f->f_fp))
+			if (!PyErr_ExceptionMatches(PyExc_IOError))
 				break;
-			PyErr_SetFromErrno(PyExc_IOError);
-			clearerr(f->f_fp);
 		  error:
 			Py_DECREF(list);
 			list = NULL;
@@ -1863,9 +1859,7 @@
 		f->f_buf, bufsize, f->f_fp, (PyObject *)f);
 	Py_END_ALLOW_THREADS
 	if (chunksize == 0) {
-		if (ferror(f->f_fp)) {
-			PyErr_SetFromErrno(PyExc_IOError);
-			clearerr(f->f_fp);
+		if (PyErr_ExceptionMatches(PyExc_IOError)) {
 			drop_readahead(f);
 			return -1;
 		}
@@ -2416,6 +2410,7 @@
 	char *dst = buf;
 	PyFileObject *f = (PyFileObject *)fobj;
 	int newlinetypes, skipnextlf;
+	size_t nread;
 
 	assert(buf != NULL);
 	assert(stream != NULL);
@@ -2424,22 +2419,35 @@
 		errno = ENXIO;	/* What can you do... */
 		return 0;
 	}
-	if (!f->f_univ_newline)
-		return fread(buf, 1, n, stream);
+	if (!f->f_univ_newline) {
+		nread = fread(buf, 1, n, stream);
+		if (nread == 0) {
+			if (ferror(stream))
+				PyErr_SetFromErrno(PyExc_IOError);
+			clearerr(stream);
+		}
+		return nread;
+	}
 	newlinetypes = f->f_newlinetypes;
 	skipnextlf = f->f_skipnextlf;
 	/* Invariant:  n is the number of bytes remaining to be filled
 	 * in the buffer.
 	 */
 	while (n) {
-		size_t nread;
 		int shortread;
 		char *src = dst;
 
 		nread = fread(dst, 1, n, stream);
 		assert(nread <= n);
-		if (nread == 0)
+		if (nread == 0) {
+			if (ferror(stream)) {
+				clearerr(stream);
+				PyErr_SetFromErrno(PyExc_IOError);
+				return 0;
+			}
+			clearerr(stream);
 			break;
+		}
 
 		n -= nread; /* assuming 1 byte out for each in; will adjust */
 		shortread = n != 0;	/* true iff EOF or error */