summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaiki Ueno <ueno@gnu.org>2021-02-21 08:42:23 +0100
committerDaiki Ueno <ueno@gnu.org>2021-03-29 10:27:38 +0200
commit94d2192a37efc9b94f59fb0ba474a7be8b6895d4 (patch)
tree15fa7ce0fe9b2edeec9b00aeb5d174bbf95ce54b
parent8bc30de107074828069c0d89060749a5de83dc0d (diff)
downloadgnutls-94d2192a37efc9b94f59fb0ba474a7be8b6895d4.tar.gz
mem: add _gnutls_reallocarray and _gnutls_reallocarray_fast
Signed-off-by: Daiki Ueno <ueno@gnu.org>
-rw-r--r--lib/mem.c24
-rw-r--r--lib/mem.h7
2 files changed, 29 insertions, 2 deletions
diff --git a/lib/mem.c b/lib/mem.c
index 32cab5a47c..9a74456dbb 100644
--- a/lib/mem.c
+++ b/lib/mem.c
@@ -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.
*/
diff --git a/lib/mem.h b/lib/mem.h
index d3eea97a40..13f47f17b4 100644
--- a/lib/mem.h
+++ b/lib/mem.h
@@ -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) { \