[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