summaryrefslogtreecommitdiff
path: root/lib/libc/stdlib/reallocarray.c
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2017-10-07 19:38:35 +0000
committerchristos <christos@NetBSD.org>2017-10-07 19:38:35 +0000
commitf3eb942a7596a9357af8f0d224e665b6a1c1e980 (patch)
treeba542f0340b6ceac9c8f625dbf4ff8263e58716e /lib/libc/stdlib/reallocarray.c
parent949e9c6e20eb75aecd1b6c7fce0220052007ff51 (diff)
add recallocarray
Diffstat (limited to 'lib/libc/stdlib/reallocarray.c')
-rw-r--r--lib/libc/stdlib/reallocarray.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/lib/libc/stdlib/reallocarray.c b/lib/libc/stdlib/reallocarray.c
index 8eba1cea116..98774156684 100644
--- a/lib/libc/stdlib/reallocarray.c
+++ b/lib/libc/stdlib/reallocarray.c
@@ -1,4 +1,4 @@
-/* $NetBSD: reallocarray.c,v 1.7 2016/04/06 11:07:58 roy Exp $ */
+/* $NetBSD: reallocarray.c,v 1.8 2017/10/07 19:38:35 christos Exp $ */
/* $OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $ */
/*-
@@ -31,10 +31,11 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: reallocarray.c,v 1.7 2016/04/06 11:07:58 roy Exp $");
+__RCSID("$NetBSD: reallocarray.c,v 1.8 2017/10/07 19:38:35 christos Exp $");
#define _OPENBSD_SOURCE
#include <errno.h>
+#include <string.h>
#include <stdlib.h>
void *
@@ -51,3 +52,15 @@ reallocarray(void *optr, size_t nmemb, size_t size)
errno = e;
return NULL;
}
+
+void *
+recallocarray(void *optr, size_t omemb, size_t nmemb, size_t size)
+{
+ char *nptr = reallocarray(optr, nmemb, size);
+
+ if (nptr == NULL || omemb >= nmemb)
+ return nptr;
+
+ memset(nptr + omemb * size, 0, (nmemb - omemb) * size);
+ return nptr;
+}