From 79fd0fcae4ecddca7ae441a4ffec4fe54ef760bc Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 12 Oct 2001 20:01:53 +0000 Subject: [PATCH] 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. --- Objects/fileobject.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 8f903d1b467..18f9ce2cc28 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))