From: Timo Sirainen Date: Wed, 9 Sep 2020 09:03:31 +0000 (+0300) Subject: lib: ostream-buffer: Return 0 as the used size, not the destination buffer size X-Git-Tag: 2.3.13~233 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48083d9e7fdbe257b0be33043ecf0ca87489eef9;p=thirdparty%2Fdovecot%2Fcore.git lib: ostream-buffer: Return 0 as the used size, not the destination buffer size 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. --- diff --git a/src/lib/ostream-buffer.c b/src/lib/ostream-buffer.c index 1a0a16f95e..0beb20ae8f 100644 --- a/src/lib/ostream-buffer.c +++ b/src/lib/ostream-buffer.c @@ -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) diff --git a/src/lib/test-ostream-buffer.c b/src/lib/test-ostream-buffer.c index 42c792f63d..4df8d6a0d8 100644 --- a/src/lib/test-ostream-buffer.c +++ b/src/lib/test-ostream-buffer.c @@ -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);