diff options
author | Daiki Ueno <ueno@gnu.org> | 2021-02-21 08:42:23 +0100 |
---|---|---|
committer | Daiki Ueno <ueno@gnu.org> | 2021-03-29 10:27:38 +0200 |
commit | 94d2192a37efc9b94f59fb0ba474a7be8b6895d4 (patch) | |
tree | 15fa7ce0fe9b2edeec9b00aeb5d174bbf95ce54b | |
parent | 8bc30de107074828069c0d89060749a5de83dc0d (diff) | |
download | gnutls-94d2192a37efc9b94f59fb0ba474a7be8b6895d4.tar.gz |
mem: add _gnutls_reallocarray and _gnutls_reallocarray_fast
Signed-off-by: Daiki Ueno <ueno@gnu.org>
-rw-r--r-- | lib/mem.c | 24 | ||||
-rw-r--r-- | lib/mem.h | 7 |
2 files changed, 29 insertions, 2 deletions
@@ -24,6 +24,7 @@ #include "errors.h" #include <num.h> #include <xsize.h> +#include "xalloc-oversized.h" gnutls_alloc_function gnutls_secure_malloc = malloc; gnutls_alloc_function gnutls_malloc = malloc; @@ -61,6 +62,23 @@ void *gnutls_realloc_fast(void *ptr, size_t size) return ret; } +/* This will free ptr in case reallocarray fails. + */ +void *_gnutls_reallocarray_fast(void *ptr, size_t nmemb, size_t size) +{ + void *ret; + + if (size == 0) + return ptr; + + ret = _gnutls_reallocarray(ptr, nmemb, size); + if (ret == NULL) { + gnutls_free(ptr); + } + + return ret; +} + char *_gnutls_strdup(const char *str) { size_t siz; @@ -77,6 +95,12 @@ char *_gnutls_strdup(const char *str) return ret; } +void *_gnutls_reallocarray(void *ptr, size_t nmemb, size_t size) +{ + return xalloc_oversized(nmemb, size) ? NULL : + gnutls_realloc(ptr, nmemb * size); +} + #if 0 /* don't use them. They are included for documentation. */ @@ -25,14 +25,17 @@ #include <config.h> -/* this realloc function will return ptr if size==0, and - * will free the ptr if the new allocation failed. +/* These realloc functions will return ptr if size==0, and will free + * the ptr if the new allocation failed. */ void *gnutls_realloc_fast(void *ptr, size_t size); +void *_gnutls_reallocarray_fast(void *ptr, size_t nmemb, size_t size); void *_gnutls_calloc(size_t nmemb, size_t size); char *_gnutls_strdup(const char *); +void *_gnutls_reallocarray(void *, size_t, size_t); + unsigned _gnutls_mem_is_zero(const uint8_t *ptr, unsigned size); #define zrelease_mpi_key(mpi) if (*mpi!=NULL) { \ |