Bring in reallocarray() from OpenBSD - stagit-gopher - A git gopher frontend. (… | |
git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2h… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 2809fd3795e8445f686547d08eef4631efc05030 | |
parent 87360fe2526f7713c4626d04da521579141fcf68 | |
Author: sin <[email protected]> | |
Date: Wed, 6 Jan 2016 17:02:28 +0000 | |
Bring in reallocarray() from OpenBSD | |
Diffstat: | |
M Makefile | 1 + | |
M compat.h | 2 ++ | |
M config.mk | 4 ++-- | |
A reallocarray.c | 39 +++++++++++++++++++++++++++++… | |
M strlcat.c | 2 ++ | |
M strlcpy.c | 2 ++ | |
6 files changed, 48 insertions(+), 2 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -6,6 +6,7 @@ SRC = \ | |
stagit.c\ | |
stagit-index.c | |
COMPATSRC = \ | |
+ reallocarray.c\ | |
strlcat.c\ | |
strlcpy.c | |
BIN = \ | |
diff --git a/compat.h b/compat.h | |
@@ -3,4 +3,6 @@ | |
size_t strlcat(char *, const char *, size_t); | |
#undef strlcpy | |
size_t strlcpy(char *, const char *, size_t); | |
+#undef reallocarray | |
+void *reallocarray(void *, size_t, size_t); | |
#endif | |
diff --git a/config.mk b/config.mk | |
@@ -28,8 +28,8 @@ LDFLAGS = ${LIBS} | |
# uncomment for compat | |
CFLAGS += -DCOMPAT | |
-# uncomment if your libc doesn't support strlcat, strlcpy. | |
-COMPATOBJ = strlcat.o strlcpy.o | |
+# uncomment if your libc doesn't support reallocarray, strlcat, strlcpy. | |
+COMPATOBJ = reallocarray.o strlcat.o strlcpy.o | |
# compiler and linker | |
#CC = cc | |
diff --git a/reallocarray.c b/reallocarray.c | |
@@ -0,0 +1,39 @@ | |
+/* | |
+ * Copyright (c) 2008 Otto Moerbeek <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+ | |
+#include <sys/types.h> | |
+#include <errno.h> | |
+#include <stdint.h> | |
+#include <stdlib.h> | |
+ | |
+#include "compat.h" | |
+ | |
+/* | |
+ * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX | |
+ * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW | |
+ */ | |
+#define MUL_NO_OVERFLOW (1UL << (sizeof(size_t) * 4)) | |
+ | |
+void * | |
+reallocarray(void *optr, size_t nmemb, size_t size) | |
+{ | |
+ if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && | |
+ nmemb > 0 && SIZE_MAX / nmemb < size) { | |
+ errno = ENOMEM; | |
+ return NULL; | |
+ } | |
+ return realloc(optr, size * nmemb); | |
+} | |
diff --git a/strlcat.c b/strlcat.c | |
@@ -19,6 +19,8 @@ | |
#include <sys/types.h> | |
#include <string.h> | |
+#include "compat.h" | |
+ | |
/* | |
* Appends src to string dst of size dsize (unlike strncat, dsize is the | |
* full size of dst, not space left). At most dsize-1 characters | |
diff --git a/strlcpy.c b/strlcpy.c | |
@@ -19,6 +19,8 @@ | |
#include <sys/types.h> | |
#include <string.h> | |
+#include "compat.h" | |
+ | |
/* | |
* Copy string src to buffer dst of size dsize. At most dsize-1 | |
* chars will be copied. Always NUL terminates (unless dsize == 0). |