[Python-checkins] r58177 - python/trunk/Modules/bz2module.c
sean.reifschneider
python-checkins at python.org
Mon Sep 17 07:45:04 CEST 2007
Author: sean.reifschneider
Date: Mon Sep 17 07:45:04 2007
New Revision: 58177
Modified:
python/trunk/Modules/bz2module.c
Log:
issue1597011: Fix for bz2 module corner-case error due to error checking bug.
Modified: python/trunk/Modules/bz2module.c
==============================================================================
--- python/trunk/Modules/bz2module.c (original)
+++ python/trunk/Modules/bz2module.c Mon Sep 17 07:45:04 2007
@@ -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;
More information about the Python-checkins
mailing list