summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2010-08-01 20:12:04 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2010-08-01 20:12:04 (GMT)
commit1e2abe73222bf9b1721afa61fb8dde71aca154d0 (patch)
tree3810545a4ff6e5d97b7c9479e92a33bdb8420b0c /Modules
parentc685068004d8a64ddac87c6facae376200c14dc7 (diff)
downloadcpython-1e2abe73222bf9b1721afa61fb8dde71aca154d0.zip
cpython-1e2abe73222bf9b1721afa61fb8dde71aca154d0.tar.gz
cpython-1e2abe73222bf9b1721afa61fb8dde71aca154d0.tar.bz2
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. ........
Diffstat (limited to 'Modules')
-rw-r--r--Modules/bz2module.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/Modules/bz2module.c b/Modules/bz2module.c
index 7c7c0e0..215fa4b 100644
--- a/Modules/bz2module.c
+++ b/Modules/bz2module.c
@@ -138,6 +138,22 @@ typedef struct {
/* ===================================================================== */
/* 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)
{
@@ -427,6 +443,10 @@ BZ2File_read(BZ2FileObject *self, PyObject *args)
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if (bytesrequested < 0)
buffersize = Util_NewBufferSize((size_t)0);
else
@@ -516,6 +536,10 @@ BZ2File_readline(BZ2FileObject *self, PyObject *args)
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if (sizehint == 0)
ret = PyBytes_FromStringAndSize("", 0);
else
@@ -573,6 +597,10 @@ BZ2File_readlines(BZ2FileObject *self, PyObject *args)
goto cleanup;
}
+ /* refuse to mix with f.next() */
+ if (check_iterbuffered(self))
+ goto cleanup;
+
if ((list = PyList_New(0)) == NULL)
goto cleanup;