]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib: ostream-buffer: Return 0 as the used size, not the destination buffer size
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 9 Sep 2020 09:03:31 +0000 (12:03 +0300)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Thu, 10 Sep 2020 13:52:24 +0000 (13:52 +0000)
This allows using ostream-buffer in places that previously would think that
the ostream buffer needed to be flushed because its buffer size was too
large.

This also changes o_stream_get_buffer_avail_size() to always return the
ostream max buffer size.

src/lib/ostream-buffer.c
src/lib/test-ostream-buffer.c

index 1a0a16f95e9df902d60ce63549e2c2108afc7f91..0beb20ae8f02bc23df6a0ec1bf037289d439f387 100644 (file)
@@ -54,11 +54,13 @@ o_stream_buffer_sendv(struct ostream_private *stream,
 }
 
 static size_t
-o_stream_buffer_get_buffer_used_size(const struct ostream_private *stream)
+o_stream_buffer_get_buffer_used_size(const struct ostream_private *stream ATTR_UNUSED)
 {
-       struct buffer_ostream *bstream = (struct buffer_ostream *)stream;
-
-       return bstream->buf->used;
+       /* Don't treat the destination buffer as the ostream buffer size.
+          Otherwise ostream-buffer can't be used in a normal way in some
+          places that stop sending more data to it if the buffer size grows
+          beyond IO_BLOCK_SIZE. */
+       return 0;
 }
 
 struct ostream *o_stream_create_buffer(buffer_t *buf)
index 42c792f63da7b0816372fac58aa44d1105a0e669..4df8d6a0d834c64d9199db03a4d2686f94ae8a62 100644 (file)
@@ -66,32 +66,34 @@ static void test_ostream_buffer_size(void)
 
        test_begin("ostream buffer size/available");
        output = o_stream_create_buffer(str);
-       test_assert(o_stream_get_buffer_used_size(output) == 0);
+       test_assert(str_len(str) == 0);
        test_assert(o_stream_get_buffer_avail_size(output) == (size_t)-1);
 
        /* test shrinking sink's max buffer size */
        o_stream_set_max_buffer_size(output, 10);
-       test_assert(o_stream_get_buffer_used_size(output) == 0);
+       test_assert(str_len(str) == 0);
        test_assert(o_stream_get_buffer_avail_size(output) == 10);
 
        /* partial send */
        const char *partial_input = "01234567890123456789";
        ssize_t ret = o_stream_send_str(output, partial_input);
        test_assert(ret == 10);
-       test_assert(o_stream_get_buffer_used_size(output) == 10);
-       test_assert(o_stream_get_buffer_avail_size(output) == 0);
+       test_assert(str_len(str) == 10);
+       test_assert(o_stream_get_buffer_avail_size(output) == 10);
        
        /* increase max buffer size so that it can hold the whole message */
        o_stream_set_max_buffer_size(output, 100);
-       test_assert(o_stream_get_buffer_used_size(output) == 10);
-       test_assert(o_stream_get_buffer_avail_size(output) == 90);
+       test_assert(str_len(str) == 10);
+       test_assert(o_stream_get_buffer_avail_size(output) == 100);
 
        /* send the rest */
        ret += o_stream_send_str(output, partial_input + ret);
        test_assert(ret == (ssize_t)strlen(partial_input));
        test_assert(output->offset == str_len(str));
-       test_assert(o_stream_get_buffer_used_size(output) == 20);
-       test_assert(o_stream_get_buffer_avail_size(output) == 80);
+       test_assert(str_len(str) == 20);
+
+       /* used size is always 0 */
+       test_assert(o_stream_get_buffer_used_size(output) == 0);
 
        /* check buffered data */
        test_assert(strcmp(str_c(str), partial_input) == 0);