Handle calloc(0,x) where different from malloc.

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.
This commit is contained in:
Darren Tucker 2018-02-25 10:20:31 +11:00
parent 2eb4041493
commit e9dede06e5
2 changed files with 19 additions and 2 deletions

View File

@ -1337,8 +1337,23 @@ AC_FUNC_STRFTIME
AC_FUNC_MALLOC AC_FUNC_MALLOC
AC_FUNC_REALLOC AC_FUNC_REALLOC
# autoconf doesn't have AC_FUNC_CALLOC so fake it if malloc returns NULL; # 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_MSG_CHECKING([if calloc(0, N) returns non-null])
AC_DEFINE(HAVE_CALLOC, 0, [calloc(x, 0) returns 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, AC_DEFINE(calloc, rpl_calloc,
[Define to rpl_calloc if the replacement function should be used.]) [Define to rpl_calloc if the replacement function should be used.])
fi fi

View File

@ -50,6 +50,8 @@ rpl_realloc(void *ptr, size_t size)
{ {
if (size == 0) if (size == 0)
size = 1; size = 1;
if (ptr == 0)
return malloc(size);
return realloc(ptr, size); return realloc(ptr, size);
} }
#endif #endif