From: Daiki Ueno Date: Sun, 20 Jul 2025 08:37:11 +0000 (+0900) Subject: str: make gnutls_buffer resizing behavior configurable at run-time X-Git-Tag: 3.8.11~30^2~14 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3ef04880a42874612cacdb42cfcbc33afbb2fa36;p=thirdparty%2Fgnutls.git str: make gnutls_buffer resizing behavior configurable at run-time Signed-off-by: Daiki Ueno --- diff --git a/lib/global.c b/lib/global.c index 1f56b86ce8..feda32eb32 100644 --- a/lib/global.c +++ b/lib/global.c @@ -281,6 +281,14 @@ static int _gnutls_global_init(unsigned constructor) bindtextdomain(PACKAGE, LOCALEDIR); #endif + e = secure_getenv("GNUTLS_BUFFER_RECLAIM"); + if (e != NULL) { + bool reclaiming = e[0] == '1' && e[1] == '\0'; + _gnutls_debug_log("Using %s buffer allocator...\n", + reclaiming ? "reclaiming" : "non-reclaiming"); + _gnutls_buffer_set_reclaiming(reclaiming); + } + res = gnutls_crypto_init(); if (res != 0) { gnutls_assert(); diff --git a/lib/str.c b/lib/str.c index 9865db7315..c6f879685e 100644 --- a/lib/str.c +++ b/lib/str.c @@ -128,15 +128,13 @@ int gnutls_buffer_append_data(gnutls_buffer_t dest, const void *data, return 0; } -#ifdef AGGRESSIVE_REALLOC - /* Use a simpler logic for reallocation; i.e., always call * gnutls_realloc_fast() and do not reclaim the no-longer-used * area which has been removed from the beginning of buffer * with _gnutls_buffer_pop_datum(). This helps hit more * issues when running under valgrind. */ -int _gnutls_buffer_resize(gnutls_buffer_st *dest, size_t new_size) +static int buffer_resize_no_reclaim(gnutls_buffer_st *dest, size_t new_size) { size_t unused; @@ -155,8 +153,6 @@ int _gnutls_buffer_resize(gnutls_buffer_st *dest, size_t new_size) return 0; } -#else - static void align_allocd_with_data(gnutls_buffer_st *dest) { assert(dest->allocd != NULL); @@ -166,7 +162,7 @@ static void align_allocd_with_data(gnutls_buffer_st *dest) dest->data = dest->allocd; } -int _gnutls_buffer_resize(gnutls_buffer_st *dest, size_t new_size) +static int buffer_resize_reclaim(gnutls_buffer_st *dest, size_t new_size) { if (unlikely(dest->data != NULL && dest->allocd == NULL)) return gnutls_assert_val(GNUTLS_E_INVALID_REQUEST); @@ -197,7 +193,14 @@ int _gnutls_buffer_resize(gnutls_buffer_st *dest, size_t new_size) } } -#endif +int (*_gnutls_buffer_resize)(gnutls_buffer_st *, + size_t) = buffer_resize_reclaim; + +void _gnutls_buffer_set_reclaiming(bool reclaiming) +{ + _gnutls_buffer_resize = reclaiming ? buffer_resize_reclaim : + buffer_resize_no_reclaim; +} /* Appends the provided string. The null termination byte is appended * but not included in length. diff --git a/lib/str.h b/lib/str.h index bc4272ca84..4e305c4200 100644 --- a/lib/str.h +++ b/lib/str.h @@ -111,7 +111,9 @@ inline static ATTRIBUTE_NONNULL() gnutls_buffer_st return dst; } -int _gnutls_buffer_resize(gnutls_buffer_st *, size_t new_size); +void _gnutls_buffer_set_reclaiming(bool reclaiming); + +extern int (*_gnutls_buffer_resize)(gnutls_buffer_st *, size_t); int _gnutls_buffer_append_str(gnutls_buffer_st *, const char *str);