changeset 8919:334d29caa084 HEAD

o_stream_send_istream(): Don't do backwards copying if the area doesn't really overlap.
author Timo Sirainen <tss@iki.fi>
date Tue, 24 Feb 2009 18:12:32 -0500
parents 3194ac1c6d75
children 8d951b66a0e5
files src/lib/ostream-file.c
diffstat 1 files changed, 6 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/ostream-file.c	Tue Feb 24 18:11:01 2009 -0500
+++ b/src/lib/ostream-file.c	Tue Feb 24 18:12:32 2009 -0500
@@ -776,7 +776,7 @@
 {
 	struct file_ostream *foutstream = (struct file_ostream *)outstream;
 	const struct stat *st;
-	off_t ret;
+	off_t in_abs_offset, ret;
 	int in_fd;
 
 	in_fd = i_stream_get_fd(instream);
@@ -791,16 +791,17 @@
 		}
 		i_assert(instream->v_offset <= (uoff_t)st->st_size);
 
-		ret = (off_t)outstream->ostream.offset -
-			(off_t)(instream->real_stream->abs_start_offset +
-				instream->v_offset);
+		in_abs_offset = instream->real_stream->abs_start_offset +
+			instream->v_offset;
+		ret = (off_t)outstream->ostream.offset - in_abs_offset;
 		if (ret == 0) {
 			/* copying data over itself. we don't really
 			   need to do that, just fake it. */
 			return st->st_size - instream->v_offset;
 		}
-		if (ret > 0) {
+		if (ret > 0 && st->st_size > ret) {
 			/* overlapping */
+			i_assert(instream->seekable);
 			return io_stream_copy_backwards(outstream, instream,
 							st->st_size);
 		}