]> granicus.if.org Git - sudo/commitdiff
Add reallocarray() for those without it.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 14 May 2015 16:13:18 +0000 (10:13 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 14 May 2015 16:13:18 +0000 (10:13 -0600)
config.h.in
configure
configure.ac
include/sudo_compat.h
lib/util/alloc.c

index 8f0b83b163a12eeb592a616a620b6b6fa892a060..290dccc2f2335c05b91f6cabdd6c556364489c9e 100644 (file)
 /* Define to 1 if you have the `random' function. */
 #undef HAVE_RANDOM
 
+/* Define to 1 if you have the `reallocarray' function. */
+#undef HAVE_REALLOCARRAY
+
 /* Define to 1 if you have the `revoke' function. */
 #undef HAVE_REVOKE
 
index 4f1607499fa67125fa9880cb288595bd50f14202..6fb5e4991ec4a9d019c747b1952a945195b65df3 100755 (executable)
--- a/configure
+++ b/configure
@@ -2653,6 +2653,7 @@ as_fn_append ac_header_list " sys/stropts.h"
 as_fn_append ac_header_list " sys/sysmacros.h"
 as_fn_append ac_func_list " killpg"
 as_fn_append ac_func_list " nl_langinfo"
+as_fn_append ac_func_list " reallocarray"
 as_fn_append ac_func_list " strftime"
 as_fn_append ac_func_list " tzset"
 as_fn_append ac_func_list " seteuid"
@@ -17921,6 +17922,8 @@ done
 
 
 
+
+
 for ac_func in getgrouplist
 do :
   ac_fn_c_check_func "$LINENO" "getgrouplist" "ac_cv_func_getgrouplist"
index 915347ada6e82d724ee71e2ceb0a8fb4ab5debf8..d2be85ef9b83cba1a4afd56f549ae832c610e414 100644 (file)
@@ -2395,7 +2395,7 @@ dnl
 dnl Function checks
 dnl
 AC_FUNC_GETGROUPS
-AC_CHECK_FUNCS_ONCE([killpg nl_langinfo strftime tzset])
+AC_CHECK_FUNCS_ONCE([killpg nl_langinfo reallocarray strftime tzset])
 AC_CHECK_FUNCS([getgrouplist], [], [
     case "$host_os" in
     aix*)
index 9d100a44f760ef6a1a3fc78a6b52b1139977cb56..fa8d6d7ff6e8a5a8be04d13394a09aa7b2d53344 100644 (file)
@@ -368,7 +368,7 @@ __dso_public long long sudo_strtonum(const char *, long long, long long, const c
  * All libc replacements are prefixed with "sudo_" to avoid namespace issues.
  */
 
-struct timeval;
+struct passwd;
 struct timespec;
 
 #ifndef HAVE_CLOSEFROM
@@ -479,5 +479,10 @@ __dso_public const char *sudo_getprogname(void);
 # undef getprogname
 # define getprogname() sudo_getprogname()
 #endif /* HAVE_GETPROGNAME */
+#ifndef HAVE_REALLOCARRAY
+__dso_public void *sudo_reallocarray(void *ptr, size_t nmemb, size_t size);
+# undef reallocarray
+# define reallocarray(_a, _b, _c) sudo_reallocarray((_a), (_b), (_c))
+#endif /* HAVE_REALLOCARRAY */
 
 #endif /* _SUDO_COMPAT_H */
index f94c04bd7d0c3fdae23a313748cc89fe40d0c2d5..5f2208d52179bb29307b56757bea82c58b7fb359 100644 (file)
@@ -48,6 +48,7 @@
 #elif defined(HAVE_INTTYPES_H)
 # include <inttypes.h>
 #endif
+#include <errno.h>
 #include <limits.h>
 
 #define DEFAULT_TEXT_DOMAIN    "sudo"
@@ -257,3 +258,17 @@ 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 */