issue1597011: Fix for bz2 module corner-case error due to error checking bug.

This commit is contained in:
Sean Reifscheider 2007-09-17 05:45:20 +00:00
parent 5cf6ef84b9
commit b5ec5876f2
1 changed files with 17 additions and 23 deletions

View File

@ -235,6 +235,7 @@ Util_GetLine(BZ2FileObject *f, int n)
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 @@ Util_GetLine(BZ2FileObject *f, int n)
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 @@ Util_GetLine(BZ2FileObject *f, int n)
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;