dovecot-2.1: istream-concat bugfixes
dovecot at dovecot.org
dovecot at dovecot.org
Wed Aug 22 15:17:59 EEST 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/c6fe6a77defd
changeset: 14675:c6fe6a77defd
user: Timo Sirainen <tss at iki.fi>
date: Wed Aug 22 15:17:53 2012 +0300
description:
istream-concat bugfixes
diffstat:
src/lib/istream-concat.c | 18 +++++++++++-------
1 files changed, 11 insertions(+), 7 deletions(-)
diffs (40 lines):
diff -r 9523b967a30e -r c6fe6a77defd src/lib/istream-concat.c
--- a/src/lib/istream-concat.c Wed Aug 22 07:49:55 2012 +0300
+++ b/src/lib/istream-concat.c Wed Aug 22 15:17:53 2012 +0300
@@ -87,7 +87,7 @@
{
struct concat_istream *cstream = (struct concat_istream *)stream;
const unsigned char *data;
- size_t size, pos, cur_pos, bytes_skipped;
+ size_t size, pos, cur_pos, bytes_skipped, new_bytes_count;
ssize_t ret;
bool last_stream;
@@ -154,17 +154,21 @@
stream->skip = 0;
} else if (pos == cur_pos) {
stream->buffer = stream->w_buffer;
+ pos = stream->pos;
} else {
+ new_bytes_count = pos - cur_pos;
+ if (!i_stream_get_buffer_space(stream, new_bytes_count, &size)) {
+ stream->buffer = stream->w_buffer;
+ return -2;
+ }
stream->buffer = stream->w_buffer;
- if (!i_stream_get_buffer_space(stream, pos - cur_pos, &size))
- return -2;
- if (pos > size)
- pos = size;
+ if (new_bytes_count > size)
+ new_bytes_count = size;
memcpy(stream->w_buffer + stream->pos,
- data + cur_pos, pos - cur_pos);
+ data + cur_pos, new_bytes_count);
+ pos = stream->pos + new_bytes_count;
}
- pos += stream->skip + cstream->prev_stream_left;
ret = pos > stream->pos ? (ssize_t)(pos - stream->pos) :
(ret == 0 ? 0 : -1);
More information about the dovecot-cvs
mailing list