From: Timo Sirainen Date: Wed, 18 May 2016 15:41:33 +0000 (+0300) Subject: lib: ostream-escaped: Fixed setting offset X-Git-Tag: 2.3.0.rc1~3706 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bcab95c672604588f1645e4a52e43f52ee567593;p=thirdparty%2Fdovecot%2Fcore.git lib: ostream-escaped: Fixed setting offset --- diff --git a/src/lib/ostream-escaped.c b/src/lib/ostream-escaped.c index c875d70c7e..b3613ca32b 100644 --- a/src/lib/ostream-escaped.c +++ b/src/lib/ostream-escaped.c @@ -40,7 +40,7 @@ static ssize_t o_stream_escaped_send_chunk(struct escaped_ostream *estream, const unsigned char *data, size_t len) { - size_t i, max_buffer_size, flush_pos; + size_t i, max_buffer_size; ssize_t ret; max_buffer_size = I_MIN(o_stream_get_max_buffer_size(estream->ostream.parent), @@ -50,24 +50,20 @@ o_stream_escaped_send_chunk(struct escaped_ostream *estream, max_buffer_size = IO_BLOCK_SIZE; } - flush_pos = str_len(estream->buf); for (i = 0; i < len; i++) { if (str_len(estream->buf) + 2 > max_buffer_size) { /* escaping takes at least two bytes */ - estream->ostream.ostream.offset += - str_len(estream->buf) - flush_pos; ret = o_stream_escaped_send_outbuf(estream); - if (ret < 0) + if (ret < 0) { + estream->ostream.ostream.offset += i; return ret; - flush_pos = str_len(estream->buf); + } if (ret == 0) break; } estream->format(estream->buf, data[i]); estream->flushed = FALSE; } - /* we'll return how many bytes of input we consumed, but ostream offset - contains how many bytes we actually wrote */ - estream->ostream.ostream.offset += str_len(estream->buf) - flush_pos; + estream->ostream.ostream.offset += i; return i; } diff --git a/src/lib/test-ostream-escaped.c b/src/lib/test-ostream-escaped.c index f64813f4a0..29d0235d9a 100644 --- a/src/lib/test-ostream-escaped.c +++ b/src/lib/test-ostream-escaped.c @@ -24,6 +24,7 @@ static void test_ostream_escaped_json(void) iov[1].iov_len = 7; test_assert(o_stream_sendv(os_encode, iov, 2) == 12); test_assert(os_encode->offset == 12); + test_assert(os_sink->offset == 12); test_assert(strcmp(str_c(str), "hello, world") == 0); /* reset buffer */ @@ -33,7 +34,8 @@ static void test_ostream_escaped_json(void) o_stream_set_max_buffer_size(os_encode, 10); o_stream_set_max_buffer_size(os_sink, 100); test_assert(o_stream_send(os_encode, "\x15\x00!\x00\x15\x11" "123456", 12) == 12); - test_assert(os_encode->offset == 2*6 + 1 + 3*6 + 6); + test_assert(os_encode->offset == 12); + test_assert(os_sink->offset == 2*6 + 1 + 3*6 + 6); test_assert(strcmp(str_c(str), "\\u0015\\u0000!\\u0000\\u0015\\u0011123456") == 0); /* reset buffer */ @@ -49,7 +51,8 @@ static void test_ostream_escaped_json(void) o_stream_set_max_buffer_size(os_sink, 100); ret += o_stream_send_str(os_encode, partial_input + ret); test_assert(ret == (ssize_t)strlen(partial_input)); - test_assert(os_encode->offset == str_len(str)); + test_assert((ssize_t)os_encode->offset == ret); + test_assert(os_sink->offset == str_len(str)); test_assert(strcmp(str_c(str), "\\u0015!\\u0001?#&") == 0); o_stream_unref(&os_encode);