diff --git a/.gitignore b/.gitignore index 5543d7a..052804e 100644 --- a/.gitignore +++ b/.gitignore @@ -142,6 +142,7 @@ include/openssl/*.h !/crypto/compat/arc4random.h !/crypto/compat/b_win.c !/crypto/compat/explicit_bzero_win.c +!/crypto/compat/getpagesize.c !/crypto/compat/posix_win.c !/crypto/compat/bsd_asprintf.c !/crypto/compat/inet_pton.c diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt index 47f0077..d7b65e2 100644 --- a/crypto/CMakeLists.txt +++ b/crypto/CMakeLists.txt @@ -681,6 +681,10 @@ if(NOT HAVE_ASPRINTF) set(EXTRA_EXPORT ${EXTRA_EXPORT} vasprintf) endif() +if(NOT HAVE_GETPAGESIZE) + set(CRYPTO_SRC ${CRYPTO_SRC} compat/getpagesize.c) +endif() + if(NOT HAVE_INET_PTON) set(CRYPTO_SRC ${CRYPTO_SRC} compat/inet_pton.c) set(EXTRA_EXPORT ${EXTRA_EXPORT} inet_pton) @@ -691,6 +695,11 @@ if(NOT HAVE_REALLOCARRAY) set(EXTRA_EXPORT ${EXTRA_EXPORT} reallocarray) endif() +if(NOT HAVE_RECALLOCARRAY) + set(CRYPTO_SRC ${CRYPTO_SRC} compat/recallocarray.c) + set(EXTRA_EXPORT ${EXTRA_EXPORT} recallocarray) +endif() + if(NOT HAVE_STRCASECMP) set(CRYPTO_SRC ${CRYPTO_SRC} compat/strcasecmp.c) set(EXTRA_EXPORT ${EXTRA_EXPORT} strcasecmp) diff --git a/crypto/Makefile.am b/crypto/Makefile.am index 23aaeac..dc94a8c 100644 --- a/crypto/Makefile.am +++ b/crypto/Makefile.am @@ -81,6 +81,10 @@ if !HAVE_ASPRINTF libcompat_la_SOURCES += compat/bsd-asprintf.c endif +if !HAVE_GETPAGESIZE +libcompat_la_SOURCES += compat/getpagesize.c +endif + if !HAVE_INET_PTON libcompat_la_SOURCES += compat/inet_pton.c endif @@ -93,6 +97,10 @@ if !HAVE_REALLOCARRAY libcompat_la_SOURCES += compat/reallocarray.c endif +if !HAVE_RECALLOCARRAY +libcompat_la_SOURCES += compat/recallocarray.c +endif + if !HAVE_TIMINGSAFE_MEMCMP libcompat_la_SOURCES += compat/timingsafe_memcmp.c endif diff --git a/crypto/compat/getpagesize.c b/crypto/compat/getpagesize.c new file mode 100644 index 0000000..098efa9 --- /dev/null +++ b/crypto/compat/getpagesize.c @@ -0,0 +1,18 @@ +/* $OpenBSD$ */ + +#include + +#ifdef _MSC_VER +#include +#endif + +int +getpagesize(void) { +#ifdef _MSC_VER + SYSTEM_INFO system_info; + GetSystemInfo(&system_info); + return system_info.dwPageSize; +#else + return sysconf(_SC_PAGESIZE); +#endif +} diff --git a/include/compat/stdlib.h b/include/compat/stdlib.h index 781be77..11f82ba 100644 --- a/include/compat/stdlib.h +++ b/include/compat/stdlib.h @@ -29,6 +29,10 @@ uint32_t arc4random_uniform(uint32_t upper_bound); void *reallocarray(void *, size_t, size_t); #endif +#ifndef HAVE_RECALLOCARRAY +void *recallocarray(void *, size_t, size_t, size_t); +#endif + #ifndef HAVE_STRTONUM long long strtonum(const char *nptr, long long minval, long long maxval, const char **errstr); diff --git a/include/compat/unistd.h b/include/compat/unistd.h index b37a2f6..d596043 100644 --- a/include/compat/unistd.h +++ b/include/compat/unistd.h @@ -39,6 +39,10 @@ int getentropy(void *buf, size_t buflen); #endif #endif +#ifndef HAVE_GETPAGESIZE +int getpagesize(void); +#endif + #define pledge(request, paths) 0 #ifndef HAVE_PIPE2 diff --git a/m4/check-libc.m4 b/m4/check-libc.m4 index 53ffce6..f9ddf73 100644 --- a/m4/check-libc.m4 +++ b/m4/check-libc.m4 @@ -2,15 +2,18 @@ AC_DEFUN([CHECK_LIBC_COMPAT], [ # Check for libc headers AC_CHECK_HEADERS([err.h readpassphrase.h]) # Check for general libc functions -AC_CHECK_FUNCS([asprintf inet_ntop inet_pton memmem readpassphrase]) -AC_CHECK_FUNCS([reallocarray strlcat strlcpy strndup strnlen strsep strtonum]) +AC_CHECK_FUNCS([asprintf getpagesize inet_ntop inet_pton memmem readpassphrase]) +AC_CHECK_FUNCS([reallocarray recallocarray]) +AC_CHECK_FUNCS([strlcat strlcpy strndup strnlen strsep strtonum]) AC_CHECK_FUNCS([timegm _mkgmtime]) AM_CONDITIONAL([HAVE_ASPRINTF], [test "x$ac_cv_func_asprintf" = xyes]) +AM_CONDITIONAL([HAVE_GETPAGESIZE], [test "x$ac_cv_func_getpagesize" = xyes]) AM_CONDITIONAL([HAVE_INET_NTOP], [test "x$ac_cv_func_inet_ntop" = xyes]) AM_CONDITIONAL([HAVE_INET_PTON], [test "x$ac_cv_func_inet_pton" = xyes]) AM_CONDITIONAL([HAVE_MEMMEM], [test "x$ac_cv_func_memmem" = xyes]) AM_CONDITIONAL([HAVE_READPASSPHRASE], [test "x$ac_cv_func_readpassphrase" = xyes]) AM_CONDITIONAL([HAVE_REALLOCARRAY], [test "x$ac_cv_func_reallocarray" = xyes]) +AM_CONDITIONAL([HAVE_RECALLOCARRAY], [test "x$ac_cv_func_recallocarray" = xyes]) AM_CONDITIONAL([HAVE_STRLCAT], [test "x$ac_cv_func_strlcat" = xyes]) AM_CONDITIONAL([HAVE_STRLCPY], [test "x$ac_cv_func_strlcpy" = xyes]) AM_CONDITIONAL([HAVE_STRNDUP], [test "x$ac_cv_func_strndup" = xyes]) @@ -173,6 +176,9 @@ fi if test "x$ac_cv_func_reallocarray" = "xno" ; then echo reallocarray >> $crypto_p_sym fi +if test "x$ac_cv_func_recallocarray" = "xno" ; then + echo recallocarray >> $crypto_p_sym +fi if test "x$ac_cv_func_strlcat" = "xno" ; then echo strlcat >> $crypto_p_sym fi diff --git a/update.sh b/update.sh index dbb9b60..6fb1da7 100755 --- a/update.sh +++ b/update.sh @@ -78,6 +78,7 @@ for i in crypto/compat libtls-standalone/compat; do $libc_src/crypt/chacha_private.h \ $libc_src/net/inet_pton.c \ $libc_src/stdlib/reallocarray.c \ + $libc_src/stdlib/recallocarray.c \ $libc_src/string/explicit_bzero.c \ $libc_src/string/strcasecmp.c \ $libc_src/string/strlcpy.c \