dovecot-2.1: zlib: Getting stream's size failed in some situations.

dovecot at dovecot.org dovecot at dovecot.org
Tue Jan 24 03:52:41 EET 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/c464072d05e0
changeset: 13986:c464072d05e0
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Jan 24 03:52:28 2012 +0200
description:
zlib: Getting stream's size failed in some situations.
This could have caused other trouble, such as with dbox +
mail_attachment_dir.

diffstat:

 src/plugins/zlib/istream-bzlib.c |  10 ++++++----
 src/plugins/zlib/istream-zlib.c  |  11 +++++++----
 2 files changed, 13 insertions(+), 8 deletions(-)

diffs (108 lines):

diff -r 096c12e69fd6 -r c464072d05e0 src/plugins/zlib/istream-bzlib.c
--- a/src/plugins/zlib/istream-bzlib.c	Tue Jan 24 03:51:20 2012 +0200
+++ b/src/plugins/zlib/istream-bzlib.c	Tue Jan 24 03:52:28 2012 +0200
@@ -14,7 +14,7 @@
 	struct istream_private istream;
 
 	bz_stream zs;
-	uoff_t eof_offset;
+	uoff_t eof_offset, stream_size;
 	size_t prev_size, high_pos;
 	struct stat last_parent_statbuf;
 
@@ -155,6 +155,7 @@
 	case BZ_STREAM_END:
 		zstream->eof_offset = stream->istream.v_offset +
 			(stream->pos - stream->skip);
+		zstream->stream_size = zstream->eof_offset;
 		if (size == 0) {
 			stream->istream.eof = TRUE;
 			return -1;
@@ -282,7 +283,7 @@
 		return st;
 
 	stream->statbuf = *st;
-	if (zstream->eof_offset == (uoff_t)-1) {
+	if (zstream->stream_size == (uoff_t)-1) {
 		uoff_t old_offset = stream->istream.v_offset;
 
 		do {
@@ -291,10 +292,10 @@
 		} while (i_stream_read(&stream->istream) > 0);
 
 		i_stream_seek(&stream->istream, old_offset);
-		if (zstream->eof_offset == (uoff_t)-1)
+		if (zstream->stream_size == (uoff_t)-1)
 			return NULL;
 	}
-	stream->statbuf.st_size = zstream->eof_offset;
+	stream->statbuf.st_size = zstream->stream_size;
 	return &stream->statbuf;
 }
 
@@ -322,6 +323,7 @@
 
 	zstream = i_new(struct bzlib_istream, 1);
 	zstream->eof_offset = (uoff_t)-1;
+	zstream->stream_size = (uoff_t)-1;
 	zstream->log_errors = log_errors;
 
 	i_stream_bzlib_init(zstream);
diff -r 096c12e69fd6 -r c464072d05e0 src/plugins/zlib/istream-zlib.c
--- a/src/plugins/zlib/istream-zlib.c	Tue Jan 24 03:51:20 2012 +0200
+++ b/src/plugins/zlib/istream-zlib.c	Tue Jan 24 03:52:28 2012 +0200
@@ -25,7 +25,7 @@
 	struct istream_private istream;
 
 	z_stream zs;
-	uoff_t eof_offset;
+	uoff_t eof_offset, stream_size;
 	size_t prev_size, high_pos;
 	uint32_t crc32;
 	struct stat last_parent_statbuf;
@@ -189,6 +189,7 @@
 		}
 		/* gzip file with concatenated content */
 		zstream->eof_offset = (uoff_t)-1;
+		zstream->stream_size = (uoff_t)-1;
 		zstream->header_read = FALSE;
 		zstream->trailer_read = FALSE;
 		zstream->crc32 = 0;
@@ -302,6 +303,7 @@
 	case Z_STREAM_END:
 		zstream->eof_offset = stream->istream.v_offset +
 			(stream->pos - stream->skip);
+		zstream->stream_size = zstream->eof_offset;
 		i_stream_skip(stream->parent,
 			      zstream->prev_size - zstream->zs.avail_in);
 		zstream->zs.avail_in = 0;
@@ -440,7 +442,7 @@
 		return st;
 
 	stream->statbuf = *st;
-	if (zstream->eof_offset == (uoff_t)-1) {
+	if (zstream->stream_size == (uoff_t)-1) {
 		uoff_t old_offset = stream->istream.v_offset;
 
 		do {
@@ -449,10 +451,10 @@
 		} while (i_stream_read(&stream->istream) > 0);
 
 		i_stream_seek(&stream->istream, old_offset);
-		if (zstream->eof_offset == (uoff_t)-1)
+		if (zstream->stream_size == (uoff_t)-1)
 			return NULL;
 	}
-	stream->statbuf.st_size = zstream->eof_offset;
+	stream->statbuf.st_size = zstream->stream_size;
 	return &stream->statbuf;
 }
 
@@ -481,6 +483,7 @@
 
 	zstream = i_new(struct zlib_istream, 1);
 	zstream->eof_offset = (uoff_t)-1;
+	zstream->stream_size = (uoff_t)-1;
 	zstream->gz = gz;
 	zstream->log_errors = log_errors;
 


More information about the dovecot-cvs mailing list