]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
str: make gnutls_buffer resizing behavior configurable at run-time
authorDaiki Ueno <ueno@gnu.org>
Sun, 20 Jul 2025 08:37:11 +0000 (17:37 +0900)
committerDaiki Ueno <ueno@gnu.org>
Tue, 22 Jul 2025 08:09:46 +0000 (17:09 +0900)
Signed-off-by: Daiki Ueno <ueno@gnu.org>
lib/global.c
lib/str.c
lib/str.h

index 1f56b86ce89bb92abf43ab20ebf726cdda2c3e28..feda32eb32fe0445c22581a78fc5bac9af2b6917 100644 (file)
@@ -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();
index 9865db7315c9191736bfd8b597a9c89a4f98686d..c6f879685e3c35b10ebbb224b3e10377d14deb32 100644 (file)
--- 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.
index bc4272ca8489bf4f01c08d0951ac5e95f42298e1..4e305c4200aebbbb4f9f577e99bfb98a22c39444 100644 (file)
--- 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);