[Python-checkins] r83442 - in python/branches/release27-maint: Lib/test/test_bz2.py Misc/NEWS Modules/bz2module.c
antoine.pitrou
python-checkins at python.org
Sun Aug 1 22:13:11 CEST 2010
Author: antoine.pitrou
Date: Sun Aug 1 22:13:11 2010
New Revision: 83442
Log:
Merged revisions 83440 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/branches/py3k
........
r83440 | antoine.pitrou | 2010-08-01 22:08:46 +0200 (dim., 01 août 2010) | 4 lines
Issue #8397: Raise an error when attempting to mix iteration and regular
reads on a BZ2File object, rather than returning incorrect results.
........
Modified:
python/branches/release27-maint/ (props changed)
python/branches/release27-maint/Lib/test/test_bz2.py
python/branches/release27-maint/Misc/NEWS
python/branches/release27-maint/Modules/bz2module.c
Modified: python/branches/release27-maint/Lib/test/test_bz2.py
==============================================================================
--- python/branches/release27-maint/Lib/test/test_bz2.py (original)
+++ python/branches/release27-maint/Lib/test/test_bz2.py Sun Aug 1 22:13:11 2010
@@ -329,6 +329,24 @@
finally:
f.close()
+ def testMixedIterationReads(self):
+ # Issue #8397: mixed iteration and reads should be forbidden.
+ f = bz2.BZ2File(self.filename, 'wb')
+ try:
+ # The internal buffer size is hard-wired to 8192 bytes, we must
+ # write out more than that for the test to stop half through
+ # the buffer.
+ f.write(self.TEXT * 100)
+ finally:
+ f.close()
+ f = bz2.BZ2File(self.filename, 'rb')
+ try:
+ next(f)
+ self.assertRaises(ValueError, f.read)
+ self.assertRaises(ValueError, f.readline)
+ self.assertRaises(ValueError, f.readlines)
+ finally:
+ f.close()
class BZ2CompressorTest(BaseTest):
def testCompress(self):
Modified: python/branches/release27-maint/Misc/NEWS
==============================================================================
--- python/branches/release27-maint/Misc/NEWS (original)
+++ python/branches/release27-maint/Misc/NEWS Sun Aug 1 22:13:11 2010
@@ -24,6 +24,9 @@
Library
-------
+- Issue #8397: Raise an error when attempting to mix iteration and regular
+ reads on a BZ2File object, rather than returning incorrect results.
+
- Issue #5294: Fix the behavior of pdb's "continue" command when called
in the top-level debugged frame.
Modified: python/branches/release27-maint/Modules/bz2module.c
==============================================================================
--- python/branches/release27-maint/Modules/bz2module.c (original)
+++ python/branches/release27-maint/Modules/bz2module.c Sun Aug 1 22:13:11 2010
@@ -144,6 +144,22 @@
/* ===================================================================== */
/* Utility functions. */
+/* Refuse regular I/O if there's data in the iteration-buffer.
+ * Mixing them would cause data to arrive out of order, as the read*
+ * methods don't use the iteration buffer. */
+static int
+check_iterbuffered(BZ2FileObject *f)
+{
+ if (f->f_buf != NULL &&
+ (f->f_bufend - f->f_bufptr) > 0 &&
+ f->f_buf[0] != '\0') {
+ PyErr_SetString(PyExc_ValueError,
+ "Mixing iteration and read methods would lose data");
+ return -1;
+ }
+ return 0;
+}
+
static int
Util_CatchBZ2Error(int bzerror)
{
@@ -527,6 +543,10 @@
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if (bytesrequested < 0)
buffersize = Util_NewBufferSize((size_t)0);
else
@@ -612,6 +632,10 @@
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if (sizehint == 0)
ret = PyString_FromString("");
else
@@ -669,6 +693,10 @@
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if ((list = PyList_New(0)) == NULL)
goto cleanup;
More information about the Python-checkins
mailing list