]> granicus.if.org Git - sudo/commitdiff
Add standalone reallocarray.c from OpenBSD instead of rolling our own.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 27 May 2015 16:04:32 +0000 (10:04 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 27 May 2015 16:04:32 +0000 (10:04 -0600)
MANIFEST
configure.ac
lib/util/alloc.c
lib/util/reallocarray.c [new file with mode: 0644]

index 2ec449fb026542d2afda35600d156f32a28a5ffc..d16ed2ba0f587a235f68d1f1fc5092d5fcf8b104 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -112,6 +112,7 @@ lib/util/mktemp.c
 lib/util/parseln.c
 lib/util/progname.c
 lib/util/pw_dup.c
+lib/util/reallocarray.c
 lib/util/regress/atofoo/atofoo_test.c
 lib/util/regress/fnmatch/fnm_test.c
 lib/util/regress/fnmatch/fnm_test.in
index 99fcb92585ec1e40aa0cc1c50db50b9c3087edc5..0d114937b5542f02ef202271851cc64b134d56ee 100644 (file)
@@ -2446,6 +2446,7 @@ AC_CHECK_FUNCS([getline], [], [
     AC_CHECK_FUNCS([fgetln])
 ])
 AC_CHECK_FUNCS([reallocarray], [], [
+    AC_LIBOBJ(reallocarray)
     SUDO_APPEND_COMPAT_EXP(sudo_reallocarray)
 ])
 dnl
index 77164c9cdd462f62bd0c12c310c3e70a8d00a936..325d2072ea024a5067f5620da51394c4b0edb70e 100644 (file)
@@ -48,7 +48,6 @@
 #elif defined(HAVE_INTTYPES_H)
 # include <inttypes.h>
 #endif
-#include <errno.h>
 #include <limits.h>
 
 #define DEFAULT_TEXT_DOMAIN    "sudo"
@@ -258,17 +257,3 @@ sudo_evasprintf_v1(char **ret, const char *fmt, va_list args)
        sudo_fatal_nodebug(NULL);
     return len;
 }
-
-#ifndef HAVE_REALLOCARRAY
-void *
-sudo_reallocarray(void *ptr, size_t nmemb, size_t size)
-{
-    if (nmemb > SIZE_MAX / size) {
-       errno = EOVERFLOW;
-       return NULL;
-    }
-
-    size *= nmemb;
-    return ptr ? realloc(ptr, size) : malloc(size);
-}
-#endif /* HAVE_REALLOCARRAY */
diff --git a/lib/util/reallocarray.c b/lib/util/reallocarray.c
new file mode 100644 (file)
index 0000000..7d2588e
--- /dev/null
@@ -0,0 +1,61 @@
+/*     $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $  */
+/*
+ * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
+ *
+ * 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 <config.h>
+
+#ifndef HAVE_REALLOCARRAY
+
+#include <sys/types.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+# endif
+#endif /* STDC_HEADERS */
+#if defined(HAVE_MALLOC_H) && !defined(STDC_HEADERS)
+# include <malloc.h>
+#endif /* HAVE_MALLOC_H && !STDC_HEADERS */
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+#include <errno.h>
+#include <limits.h>
+
+#include "sudo_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        ((size_t)1 << (sizeof(size_t) * 4))
+
+void *
+sudo_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);
+}
+
+#endif /* HAVE_REALLOCARRAY */