issue1597011: Fix for bz2 module corner-case error due to error checking bug.
diff --git a/Modules/bz2module.c b/Modules/bz2module.c
index 053461f..0752a56 100644
--- a/Modules/bz2module.c
+++ b/Modules/bz2module.c
@@ -235,6 +235,7 @@
size_t increment; /* amount to increment the buffer */
PyObject *v;
int bzerror;
+ int bytes_read;
int newlinetypes = f->f_newlinetypes;
int skipnextlf = f->f_skipnextlf;
int univ_newline = f->f_univ_newline;
@@ -249,24 +250,22 @@
for (;;) {
Py_BEGIN_ALLOW_THREADS
- if (univ_newline) {
- while (1) {
- BZ2_bzRead(&bzerror, f->fp, &c, 1);
- f->pos++;
- if (bzerror != BZ_OK || buf == end)
- break;
+ while (buf != end) {
+ bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
+ f->pos++;
+ if (bytes_read == 0) break;
+ if (univ_newline) {
if (skipnextlf) {
skipnextlf = 0;
if (c == '\n') {
- /* Seeing a \n here with
- * skipnextlf true means we
+ /* Seeing a \n here with skipnextlf true means we
* saw a \r before.
*/
newlinetypes |= NEWLINE_CRLF;
- BZ2_bzRead(&bzerror, f->fp,
- &c, 1);
- if (bzerror != BZ_OK)
- break;
+ if (bzerror != BZ_OK) break;
+ bytes_read = BZ2_bzRead(&bzerror, f->fp, &c, 1);
+ f->pos++;
+ if (bytes_read == 0) break;
} else {
newlinetypes |= NEWLINE_CR;
}
@@ -274,19 +273,14 @@
if (c == '\r') {
skipnextlf = 1;
c = '\n';
- } else if ( c == '\n')
+ } else if (c == '\n')
newlinetypes |= NEWLINE_LF;
- *buf++ = c;
- if (c == '\n') break;
}
- if (bzerror == BZ_STREAM_END && skipnextlf)
- newlinetypes |= NEWLINE_CR;
- } else /* If not universal newlines use the normal loop */
- do {
- BZ2_bzRead(&bzerror, f->fp, &c, 1);
- f->pos++;
- *buf++ = c;
- } while (bzerror == BZ_OK && c != '\n' && buf != end);
+ *buf++ = c;
+ if (bzerror != BZ_OK || c == '\n') break;
+ }
+ if (univ_newline && bzerror == BZ_STREAM_END && skipnextlf)
+ newlinetypes |= NEWLINE_CR;
Py_END_ALLOW_THREADS
f->f_newlinetypes = newlinetypes;
f->f_skipnextlf = skipnextlf;