]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: ostream-escaped: Fixed setting offset
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 18 May 2016 15:41:33 +0000 (18:41 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 18 May 2016 15:44:01 +0000 (18:44 +0300)
src/lib/ostream-escaped.c
src/lib/test-ostream-escaped.c

index c875d70c7eeb697d9e3f5239df43c116e2967018..b3613ca32b4c5843d952bbfcbcd57b87c3806dcb 100644 (file)
@@ -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;
 }
 
index f64813f4a0c7c37240b1c1a0f95170275afb493b..29d0235d9a8f59d2a26c7661e15171d98305f622 100644 (file)
@@ -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);