summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-10-12 20:01:53 (GMT)
committerGuido van Rossum <guido@python.org>2001-10-12 20:01:53 (GMT)
commit79fd0fcae4ecddca7ae441a4ffec4fe54ef760bc (patch)
treed9e366ba08cd41d696cf2c171f0ac2ae7738e2b5
parentc65b3d95b6ef2194e4e92c93e276a07aed0e2464 (diff)
downloadcpython-79fd0fcae4ecddca7ae441a4ffec4fe54ef760bc.zip
cpython-79fd0fcae4ecddca7ae441a4ffec4fe54ef760bc.tar.gz
cpython-79fd0fcae4ecddca7ae441a4ffec4fe54ef760bc.tar.bz2
Band-aid solution to SF bug #470634: readlines() on linux requires 2 ^D's.
The problem is that if fread() returns a short count, we attempt another fread() the next time through the loop, and apparently glibc clears or ignores the eof condition so the second fread() requires another ^D to make it see the eof condition. According to the man page (and the C std, I hope) fread() can only return a short count on error or eof. I'm using that in the band-aid solution to avoid calling fread() a second time after a short read. Note that xreadlines() still has this problem: it calls readlines(sizehint) until it gets a zero-length return. Since xreadlines() is mostly used for reading real files, I won't worry about this until we get a bug report.
-rw-r--r--Objects/fileobject.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/Objects/fileobject.c b/Objects/fileobject.c
index 8f903d1..18f9ce2 100644
--- a/Objects/fileobject.c
+++ b/Objects/fileobject.c
@@ -1045,6 +1045,7 @@ file_readlines(PyFileObject *f, PyObject *args)
size_t totalread = 0;
char *p, *q, *end;
int err;
+ int shortread = 0;
if (f->f_fp == NULL)
return err_closed();
@@ -1053,10 +1054,16 @@ file_readlines(PyFileObject *f, PyObject *args)
if ((list = PyList_New(0)) == NULL)
return NULL;
for (;;) {
- Py_BEGIN_ALLOW_THREADS
- errno = 0;
- nread = fread(buffer+nfilled, 1, buffersize-nfilled, f->f_fp);
- Py_END_ALLOW_THREADS
+ if (shortread)
+ nread = 0;
+ else {
+ Py_BEGIN_ALLOW_THREADS
+ errno = 0;
+ nread = fread(buffer+nfilled, 1,
+ buffersize-nfilled, f->f_fp);
+ Py_END_ALLOW_THREADS
+ shortread = (nread < buffersize-nfilled);
+ }
if (nread == 0) {
sizehint = 0;
if (!ferror(f->f_fp))