]> granicus.if.org Git - python/commitdiff
issue1597011: Fix for bz2 module corner-case error due to error checking bug.
authorSean Reifscheider <jafo@tummy.com>
Mon, 17 Sep 2007 05:45:20 +0000 (05:45 +0000)
committerSean Reifscheider <jafo@tummy.com>
Mon, 17 Sep 2007 05:45:20 +0000 (05:45 +0000)
Modules/bz2module.c

index 9d92cf6bb4028df9da266fef2ee06cfc27198178..7d33a77f128d5738621bc37421962bd1222a89e4 100644 (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;