Mercurial > dovecot > core-2.2
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); }