From 94d2192a37efc9b94f59fb0ba474a7be8b6895d4 Mon Sep 17 00:00:00 2001
From: Daiki Ueno <ueno@gnu.org>
Date: Sun, 21 Feb 2021 08:42:23 +0100
Subject: [PATCH 1/5] mem: add _gnutls_reallocarray and
 _gnutls_reallocarray_fast

Signed-off-by: Daiki Ueno <ueno@gnu.org>
---
 lib/mem.c | 24 ++++++++++++++++++++++++
 lib/mem.h |  7 +++++--
 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) { \
-- 
2.30.2

