libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit d7cac578837064baabe1284072be1ceb34dae23e
parent 0eb370643d71402cbfb2f33f9dba1f9b6d86473a
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Wed, 29 Sep 2021 16:15:35 +0300

connection_maximize_write_buffer(): don't try to grow if no space is available

Diffstat:
Msrc/microhttpd/connection.c | 35++++++++++++++++++++---------------
1 file changed, 20 insertions(+), 15 deletions(-)

diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c @@ -1523,27 +1523,32 @@ connection_maximize_write_buffer (struct MHD_Connection *connection) struct MemoryPool *const pool = connection->pool; void *new_buf; size_t new_size; + size_t free_size; mhd_assert ((NULL != c->write_buffer) || (0 == c->write_buffer_size)); mhd_assert (c->write_buffer_append_offset >= c->write_buffer_send_offset); mhd_assert (c->write_buffer_size >= c->write_buffer_append_offset); - new_size = c->write_buffer_size + MHD_pool_get_free (pool); - new_buf = MHD_pool_reallocate (pool, - c->write_buffer, - c->write_buffer_size, - new_size); - /* Buffer position must not be moved. - * Position could be moved only if buffer was allocated 'from_end', - * which cannot happen. */ - mhd_assert ((c->write_buffer == new_buf) || (NULL == c->write_buffer)); - c->write_buffer = new_buf; - c->write_buffer_size = new_size; - if (c->write_buffer_send_offset == c->write_buffer_append_offset) + free_size = MHD_pool_get_free (pool); + if (0 != free_size) { - /* All data have been sent, reset offsets to zero. */ - c->write_buffer_send_offset = 0; - c->write_buffer_append_offset = 0; + new_size = c->write_buffer_size + free_size; + new_buf = MHD_pool_reallocate (pool, + c->write_buffer, + c->write_buffer_size, + new_size); + /* Buffer position must not be moved. + * Position could be moved only if buffer was allocated 'from_end', + * which cannot happen. */ + mhd_assert ((c->write_buffer == new_buf) || (NULL == c->write_buffer)); + c->write_buffer = new_buf; + c->write_buffer_size = new_size; + if (c->write_buffer_send_offset == c->write_buffer_append_offset) + { + /* All data have been sent, reset offsets to zero. */ + c->write_buffer_send_offset = 0; + c->write_buffer_append_offset = 0; + } } return c->write_buffer_size - c->write_buffer_append_offset;