implement reallocarray
authorAriadne Conill <ariadne@dereferenced.org>
Sat, 1 Aug 2020 14:26:35 +0000 (08:26 -0600)
committerRich Felker <dalias@aerifal.cx>
Mon, 30 Nov 2020 21:49:58 +0000 (16:49 -0500)
reallocarray is an extension introduced by OpenBSD, which introduces
calloc overflow checking to realloc.

glibc 2.28 introduced support for this function behind _GNU_SOURCE,
while glibc 2.29 allows its usage in _DEFAULT_SOURCE.

include/stdlib.h
src/malloc/reallocarray.c [new file with mode: 0644]

index 194c203..b54a051 100644 (file)
@@ -145,6 +145,7 @@ int getloadavg(double *, int);
 int clearenv(void);
 #define WCOREDUMP(s) ((s) & 0x80)
 #define WIFCONTINUED(s) ((s) == 0xffff)
+void *reallocarray (void *, size_t, size_t);
 #endif
 
 #ifdef _GNU_SOURCE
diff --git a/src/malloc/reallocarray.c b/src/malloc/reallocarray.c
new file mode 100644 (file)
index 0000000..4a6ebe4
--- /dev/null
@@ -0,0 +1,13 @@
+#define _BSD_SOURCE
+#include <errno.h>
+#include <stdlib.h>
+
+void *reallocarray(void *ptr, size_t m, size_t n)
+{
+       if (n && m > -1 / n) {
+               errno = ENOMEM;
+               return 0;
+       }
+
+       return realloc(ptr, m * n);
+}