[dovecot-cvs] dovecot/src/lib istream-seekable.c,1.3,1.4

cras at dovecot.org cras at dovecot.org
Sat May 28 15:17:42 EEST 2005


Update of /var/lib/cvs/dovecot/src/lib
In directory talvi:/tmp/cvs-serv7176

Modified Files:
	istream-seekable.c 
Log Message:
Seekable stream was broken after its memory limit was reached and it started
using temporary file.



Index: istream-seekable.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib/istream-seekable.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- istream-seekable.c	23 Apr 2005 19:41:40 -0000	1.3
+++ istream-seekable.c	28 May 2005 12:17:40 -0000	1.4
@@ -199,7 +199,7 @@
 {
 	struct seekable_istream *sstream = (struct seekable_istream *)stream;
 	const unsigned char *data;
-	size_t size;
+	size_t size, pos;
 	ssize_t ret;
 
 	stream->buffer = CONST_PTR_OFFSET(stream->buffer, stream->skip);
@@ -215,6 +215,7 @@
 			i_stream_close(&stream->istream);
 			return -1;
 		}
+		i_assert(sstream->buffer == NULL);
 	}
 
 	while (stream->istream.v_offset + stream->pos >= sstream->write_peak) {
@@ -231,6 +232,7 @@
 			i_stream_close(&stream->istream);
 			return -1;
 		}
+		i_stream_sync(sstream->fd_input);
 		i_stream_skip(sstream->cur_input, size);
 		sstream->write_peak += size;
 	}
@@ -242,6 +244,14 @@
 		stream->istream.stream_errno =
 			sstream->fd_input->stream_errno;
 	}
+
+	stream->buffer = i_stream_get_data(sstream->fd_input, &pos);
+	stream->pos -= stream->skip;
+	stream->skip = 0;
+
+	ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
+		(ret == 0 ? 0 : -1);
+	stream->pos = pos;
 	return ret;
 }
 
@@ -264,8 +274,10 @@
 			i_stream_skip(&stream->istream, stream->skip);
 		} while ((ret = _read(stream)) > 0);
 
-		if (ret == 0)
-			i_panic("get_size() used for non-blocking stream");
+		if (ret == 0) {
+			i_panic("i_stream_stat() used for non-blocking "
+				"seekable stream");
+		}
 		i_stream_seek(&stream->istream, old_offset);
 	}
 



More information about the dovecot-cvs mailing list