summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2006-02-18 21:57:28 (GMT)
committerGeorg Brandl <georg@python.org>2006-02-18 21:57:28 (GMT)
commitdc2a854b139d4ff6ee80b7b1826612f1dabda952 (patch)
tree3933dfb6ccc92dfe7535bba6187eed3186ceacb8
parentf3cba11e55da33f6c83ba831716237b672cfcc42 (diff)
downloadcpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.zip
cpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.tar.gz
cpython-dc2a854b139d4ff6ee80b7b1826612f1dabda952.tar.bz2
Bug #1366000: cleanup BZ2File.seek() logic. Fixes the case of whence=2, offset>=0.
-rw-r--r--Modules/bz2module.c75
1 files changed, 33 insertions, 42 deletions
diff --git a/Modules/bz2module.c b/Modules/bz2module.c
index 7eaea28..9171068 100644
--- a/Modules/bz2module.c
+++ b/Modules/bz2module.c
@@ -1017,50 +1017,43 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
goto cleanup;;
}
- if (offset < 0) {
- if (where == 1) {
- offset = self->pos + offset;
- rewind = 1;
- } else if (where == 2) {
- if (self->size == -1) {
- assert(self->mode != MODE_READ_EOF);
- for (;;) {
- Py_BEGIN_ALLOW_THREADS
- chunksize = Util_UnivNewlineRead(
- &bzerror, self->fp,
- buffer, buffersize,
- self);
- self->pos += chunksize;
- Py_END_ALLOW_THREADS
-
- bytesread += chunksize;
- if (bzerror == BZ_STREAM_END) {
- break;
- } else if (bzerror != BZ_OK) {
- Util_CatchBZ2Error(bzerror);
- goto cleanup;
- }
+ if (where == 2) {
+ if (self->size == -1) {
+ assert(self->mode != MODE_READ_EOF);
+ for (;;) {
+ Py_BEGIN_ALLOW_THREADS
+ chunksize = Util_UnivNewlineRead(
+ &bzerror, self->fp,
+ buffer, buffersize,
+ self);
+ self->pos += chunksize;
+ Py_END_ALLOW_THREADS
+
+ bytesread += chunksize;
+ if (bzerror == BZ_STREAM_END) {
+ break;
+ } else if (bzerror != BZ_OK) {
+ Util_CatchBZ2Error(bzerror);
+ goto cleanup;
}
- self->mode = MODE_READ_EOF;
- self->size = self->pos;
- bytesread = 0;
}
- offset = self->size + offset;
- if (offset >= self->pos)
- offset -= self->pos;
- else
- rewind = 1;
+ self->mode = MODE_READ_EOF;
+ self->size = self->pos;
+ bytesread = 0;
}
- if (offset < 0)
- offset = 0;
- } else if (where == 0) {
- if (offset >= self->pos)
- offset -= self->pos;
- else
- rewind = 1;
+ offset = self->size + offset;
+ } else if (where == 1) {
+ offset = self->pos + offset;
}
- if (rewind) {
+ /* Before getting here, offset must be the absolute position the file
+ * pointer should be set to. */
+
+ if (offset >= self->pos) {
+ /* we can move forward */
+ offset -= self->pos;
+ } else {
+ /* we cannot move back, so rewind the stream */
BZ2_bzReadClose(&bzerror, self->fp);
if (bzerror != BZ_OK) {
Util_CatchBZ2Error(bzerror);
@@ -1079,11 +1072,9 @@ BZ2File_seek(BZ2FileObject *self, PyObject *args)
goto cleanup;
}
self->mode = MODE_READ;
- } else if (self->mode == MODE_READ_EOF) {
- goto exit;
}
- if (offset == 0)
+ if (offset <= 0 || self->mode == MODE_READ_EOF)
goto exit;
/* Before getting here, offset must be set to the number of bytes