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();
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;
return 0;
}
-#else
-
static void align_allocd_with_data(gnutls_buffer_st *dest)
{
assert(dest->allocd != NULL);
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);
}
}
-#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.
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);