changeset 20266:bd22ff741f5d

lib: ostream-escaped: Fixed setting offset
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Wed, 18 May 2016 18:41:33 +0300
parents 2e9253743a09
children e0c9a4da066a
files src/lib/ostream-escaped.c src/lib/test-ostream-escaped.c
diffstat 2 files changed, 10 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib/ostream-escaped.c	Mon May 16 19:16:55 2016 +0300
+++ b/src/lib/ostream-escaped.c	Wed May 18 18:41:33 2016 +0300
@@ -40,7 +40,7 @@
 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 @@
 		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;
 }
 
--- a/src/lib/test-ostream-escaped.c	Mon May 16 19:16:55 2016 +0300
+++ b/src/lib/test-ostream-escaped.c	Wed May 18 18:41:33 2016 +0300
@@ -24,6 +24,7 @@
 	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 @@
 	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 @@
 	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);