]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Handle calloc(0,x) where different from malloc.
authorDarren Tucker <dtucker@dtucker.net>
Sat, 24 Feb 2018 23:20:31 +0000 (10:20 +1100)
committerDarren Tucker <dtucker@dtucker.net>
Sun, 25 Feb 2018 13:09:04 +0000 (00:09 +1100)
Configure assumes that if malloc(0) returns null then calloc(0,n)
also does.  On some old platforms (SunOS4) malloc behaves as expected
(as determined by AC_FUNC_MALLOC) but calloc doesn't.  Test for this
at configure time and activate the replacement function if found, plus
handle this case in rpl_calloc.

configure.ac
openbsd-compat/bsd-malloc.c

index 03cc3f869a67ed1ad8051b2fa73f069b0d814121..605844ba2cf826929bc33cf29bcd74e0894f2597 100644 (file)
@@ -1337,8 +1337,23 @@ AC_FUNC_STRFTIME
 AC_FUNC_MALLOC
 AC_FUNC_REALLOC
 # autoconf doesn't have AC_FUNC_CALLOC so fake it if malloc returns NULL;
-if test "x$ac_cv_func_malloc_0_nonnull" != "xyes"; then
-       AC_DEFINE(HAVE_CALLOC, 0, [calloc(x, 0) returns NULL])
+AC_MSG_CHECKING([if calloc(0, N) returns non-null])
+AC_RUN_IFELSE(
+       [AC_LANG_PROGRAM(
+               [[ #include <stdlib.h> ]],
+               [[ void *p = calloc(0, 1); exit(p == NULL); ]]
+       )],
+       [ func_calloc_0_nonnull=yes ],
+       [ func_calloc_0_nonnull=no ],
+       [ AC_MSG_WARN([cross compiling: assuming same as malloc])
+         func_calloc_0_nonnull="$ac_cv_func_malloc_0_nonnull"]
+)
+AC_MSG_RESULT([$func_calloc_0_nonnull])
+
+if test "x$func_calloc_0_nonnull" == "xyes"; then
+       AC_DEFINE(HAVE_CALLOC, 1, [calloc(0, x) returns non-null])
+else
+       AC_DEFINE(HAVE_CALLOC, 0, [calloc(0, x) returns NULL])
        AC_DEFINE(calloc, rpl_calloc,
            [Define to rpl_calloc if the replacement function should be used.])
 fi
index 6402ab588b09569e1017ba8e4b81a19c88a157fc..482facdc9a34420eb3ba0be90dc4c25b5e9e0988 100644 (file)
@@ -50,6 +50,8 @@ rpl_realloc(void *ptr, size_t size)
 {
        if (size == 0)
                size = 1;
+       if (ptr == 0)
+               return malloc(size);
        return realloc(ptr, size);
 }
 #endif