From 3f488b31c08c029463c49a4193db27d70e79fdaa Mon Sep 17 00:00:00 2001 From: Brent Cook Date: Mon, 15 Feb 2016 13:38:21 -0600 Subject: [PATCH] share more check-libc and check-os macros with LibreSSL --- configure.ac | 75 +++++++---------------------------- m4/check-libc-compat.m4 | 88 +++++++++++++++++++++++++++++++++++++++++ m4/check-os-options.m4 | 58 ++++++++++++++++++++++++--- 3 files changed, 155 insertions(+), 66 deletions(-) create mode 100644 m4/check-libc-compat.m4 diff --git a/configure.ac b/configure.ac index a1fb6fd..769103b 100644 --- a/configure.ac +++ b/configure.ac @@ -34,23 +34,28 @@ AC_PROG_YACC CHECK_OS_OPTIONS +CHECK_CRYPTO_COMPAT + # check functions that are expected to be in libc -AC_CHECK_FUNCS([adjfreq ntp_adjtime adjtimex]) -AC_CHECK_FUNCS([arc4random arc4random_uniform asprintf explicit_bzero]) -AC_CHECK_FUNCS([closefrom daemon getentropy memmem poll reallocarray]) +AC_CHECK_FUNCS([asprintf closefrom daemon memmem poll reallocarray]) AC_CHECK_FUNCS([setproctitle setgroups]) AC_CHECK_FUNCS([setregid setresgid setreuid setresuid]) AC_CHECK_FUNCS([strlcat strlcpy strtonum sysconf]) # check auxiliary libraries that might contain other functions AC_SEARCH_LIBS([arc4random], [crypto]) -AC_SEARCH_LIBS([clock_getres],[rt posix4]) -AC_SEARCH_LIBS([clock_gettime],[rt posix4]) AC_SEARCH_LIBS([ibuf_open], [util]) -AC_SEARCH_LIBS([dl_iterate_phdr],[dl]) -AC_CHECK_FUNCS([arc4random ibuf_open]) +AC_CHECK_FUNCS([ibuf_open]) + +# time-specific system functions +AC_CHECK_FUNCS([adjfreq ntp_adjtime adjtimex]) AC_CHECK_FUNCS([clock_gettime clock_getres]) +AC_SEARCH_LIBS([clock_getres],[rt posix4]) +AC_SEARCH_LIBS([clock_gettime],[rt posix4]) +AM_CONDITIONAL([HAVE_ADJFREQ], [test "x$ac_cv_func_adjfreq" = xyes]) +AM_CONDITIONAL([HAVE_CLOCK_GETRES], [test "x$ac_cv_func_clock_getres" = xyes]) +AM_CONDITIONAL([HAVE_CLOCK_GETTIME], [test "x$ac_cv_func_clock_gettime" = xyes]) # check for libtls AC_SEARCH_LIBS([tls_config_set_ca_mem],[tls], @@ -84,16 +89,10 @@ if test "x$ac_cv_func_tls_config_set_ca_mem" = xyes \ fi # Share test results with automake -AM_CONDITIONAL([HAVE_ADJFREQ], [test "x$ac_cv_func_adjfreq" = xyes]) -AM_CONDITIONAL([HAVE_ARC4RANDOM], [test "x$ac_cv_func_arc4random" = xyes]) -AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM], [test "x$ac_cv_func_arc4random_uniform" = xyes]) AM_CONDITIONAL([HAVE_ASPRINTF], [test "x$ac_cv_func_asprintf" = xyes]) AM_CONDITIONAL([HAVE_CLOSEFROM], [test "x$ac_cv_func_closefrom" = xyes]) -AM_CONDITIONAL([HAVE_CLOCK_GETRES], [test "x$ac_cv_func_clock_getres" = xyes]) -AM_CONDITIONAL([HAVE_CLOCK_GETTIME], [test "x$ac_cv_func_clock_gettime" = xyes]) AM_CONDITIONAL([HAVE_DAEMON], [test "x$ac_cv_func_daemon" = xyes]) AM_CONDITIONAL([HAVE_EXPLICIT_BZERO], [test "x$ac_cv_func_explicit_bzero" = xyes]) -AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = xyes]) AM_CONDITIONAL([HAVE_IFADDRS_H], [test "x$ac_cv_header_ifaddrs_h" = xyes]) AM_CONDITIONAL([HAVE_IMSG], [test "x$ac_cv_func_ibuf_open" = xyes]) AM_CONDITIONAL([HAVE_MEMMEM], [test "x$ac_cv_func_memmem" = xyes]) @@ -108,55 +107,11 @@ AM_CONDITIONAL([HAVE_STRLCPY], [test "x$ac_cv_func_strlcpy" = xyes]) AM_CONDITIONAL([HAVE_STRTONUM], [test "x$ac_cv_func_strtonum" = xyes]) AM_CONDITIONAL([HAVE_SYSCONF], [test "x$ac_cv_func_sysconf" = xyes]) -# overrides for arc4random implementations with known issues -AM_CONDITIONAL([HAVE_ARC4RANDOM], - [test "x$HOST_OS" != xdarwin \ - -a "x$HOST_OS" != xfreebsd \ - -a "x$HOST_OS" != xnetbsd \ - -a "x$ac_cv_func_arc4random" = xyes]) -AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM], - [test "x$HOST_OS" != xdarwin \ - -a "x$HOST_OS" != xfreebsd \ - -a "x$HOST_OS" != xnetbsd \ - -a "x$ac_cv_func_arc4random_uniform" = xyes]) - -AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], - [[ extern char *__progname; printf("%s", __progname); ]])], - [ ac_cv_libc_defines___progname="yes" ], - [ ac_cv_libc_defines___progname="no" - ]) -]) -if test "x$ac_cv_libc_defines___progname" = "xyes" ; then - AC_DEFINE([HAVE___PROGNAME], [1], [Define if libc defines __progname]) -fi - -AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ -#include -va_list x,y; - ]], [[ va_copy(x,y); ]])], - [ ac_cv_have_va_copy="yes" ], - [ ac_cv_have_va_copy="no" - ]) -]) -if test "x$ac_cv_have_va_copy" = "xyes" ; then - AC_DEFINE([HAVE_VA_COPY], [1], [Define if va_copy exists]) -fi - -AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [ - AC_LINK_IFELSE([AC_LANG_PROGRAM([[ -#include -va_list x,y; - ]], [[ __va_copy(x,y); ]])], - [ ac_cv_have___va_copy="yes" ], [ ac_cv_have___va_copy="no" - ]) -]) -if test "x$ac_cv_have___va_copy" = "xyes" ; then - AC_DEFINE([HAVE___VA_COPY], [1], [Define if __va_copy exists]) -fi +CHECK_PROGNAME +CHECK_VA_COPY AC_CHECK_HEADERS([sys/sysctl.h err.h ifaddrs.h paths.h]) + AC_CHECK_HEADERS([sys/sensors.h], AM_CONDITIONAL(HAVE_SENSORS, true), AM_CONDITIONAL(HAVE_SENSORS, false) diff --git a/m4/check-libc-compat.m4 b/m4/check-libc-compat.m4 new file mode 100644 index 0000000..f790780 --- /dev/null +++ b/m4/check-libc-compat.m4 @@ -0,0 +1,88 @@ +AC_DEFUN([CHECK_PROGNAME], [ +AC_CACHE_CHECK([if libc defines __progname], ac_cv_libc_defines___progname, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[]], + [[ extern char *__progname; printf("%s", __progname); ]])], + [ ac_cv_libc_defines___progname="yes" ], + [ ac_cv_libc_defines___progname="no" + ]) +]) +if test "x$ac_cv_libc_defines___progname" = "xyes" ; then + AC_DEFINE([HAVE___PROGNAME], [1], [Define if libc defines __progname]) +fi +]) + +AC_DEFUN([CHECK_SYSCALL_COMPAT], [ +AC_CHECK_FUNCS([accept4 pledge poll]) +AM_CONDITIONAL([HAVE_ACCEPT4], [test "x$ac_cv_func_accept4" = xyes]) +AM_CONDITIONAL([HAVE_PLEDGE], [test "x$ac_cv_func_pledge" = xyes]) +AM_CONDITIONAL([HAVE_POLL], [test "x$ac_cv_func_poll" = xyes]) +]) + +AC_DEFUN([CHECK_B64_NTOP], [ +AC_SEARCH_LIBS([b64_ntop],[resolv]) +AC_SEARCH_LIBS([__b64_ntop],[resolv]) +AC_CACHE_CHECK([for b64_ntop], ac_cv_have_b64_ntop_arg, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +#include +#include +#include + ]], [[ b64_ntop(NULL, 0, NULL, 0); ]])], + [ ac_cv_have_b64_ntop_arg="yes" ], + [ ac_cv_have_b64_ntop_arg="no" + ]) +]) +AM_CONDITIONAL([HAVE_B64_NTOP], [test "x$ac_cv_func_b64_ntop_arg" = xyes]) +]) + +AC_DEFUN([CHECK_CRYPTO_COMPAT], [ +# Check crypto-related libc functions and syscalls +AC_CHECK_FUNCS([arc4random arc4random_buf arc4random_uniform]) +AC_CHECK_FUNCS([explicit_bzero getauxval getentropy]) +AC_CHECK_FUNCS([timingsafe_bcmp timingsafe_memcmp]) +AM_CONDITIONAL([HAVE_ARC4RANDOM], [test "x$ac_cv_func_arc4random" = xyes]) +AM_CONDITIONAL([HAVE_ARC4RANDOM_BUF], [test "x$ac_cv_func_arc4random_buf" = xyes]) +AM_CONDITIONAL([HAVE_ARC4RANDOM_UNIFORM], [test "x$ac_cv_func_arc4random_uniform" = xyes]) +AM_CONDITIONAL([HAVE_EXPLICIT_BZERO], [test "x$ac_cv_func_explicit_bzero" = xyes]) +AM_CONDITIONAL([HAVE_GETENTROPY], [test "x$ac_cv_func_getentropy" = xyes]) +AM_CONDITIONAL([HAVE_TIMINGSAFE_BCMP], [test "x$ac_cv_func_timingsafe_bcmp" = xyes]) +AM_CONDITIONAL([HAVE_TIMINGSAFE_MEMCMP], [test "x$ac_cv_func_timingsafe_memcmp" = xyes]) + +# Override arc4random_buf implementations with known issues +AM_CONDITIONAL([HAVE_ARC4RANDOM_BUF], + [test "x$USE_BUILTIN_ARC4RANDOM" != yes \ + -a "x$ac_cv_func_arc4random_buf" = xyes]) + +# Check for getentropy fallback dependencies +AC_CHECK_FUNC([getauxval]) +AC_CHECK_FUNC([clock_gettime],, [AC_SEARCH_LIBS([clock_gettime],[rt posix4])]) +AC_CHECK_FUNC([dl_iterate_phdr],, [AC_SEARCH_LIBS([dl_iterate_phdr],[dl])]) +]) + +AC_DEFUN([CHECK_VA_COPY], [ +AC_CACHE_CHECK([whether va_copy exists], ac_cv_have_va_copy, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +va_list x,y; + ]], [[ va_copy(x,y); ]])], + [ ac_cv_have_va_copy="yes" ], + [ ac_cv_have_va_copy="no" + ]) +]) +if test "x$ac_cv_have_va_copy" = "xyes" ; then + AC_DEFINE([HAVE_VA_COPY], [1], [Define if va_copy exists]) +fi + +AC_CACHE_CHECK([whether __va_copy exists], ac_cv_have___va_copy, [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +va_list x,y; + ]], [[ __va_copy(x,y); ]])], + [ ac_cv_have___va_copy="yes" ], [ ac_cv_have___va_copy="no" + ]) +]) +if test "x$ac_cv_have___va_copy" = "xyes" ; then + AC_DEFINE([HAVE___VA_COPY], [1], [Define if __va_copy exists]) +fi +]) diff --git a/m4/check-os-options.m4 b/m4/check-os-options.m4 index 2b5b563..d4d02d9 100644 --- a/m4/check-os-options.m4 +++ b/m4/check-os-options.m4 @@ -3,8 +3,23 @@ AC_DEFUN([CHECK_OS_OPTIONS], [ CFLAGS="$CFLAGS -Wall -std=gnu99 -fno-strict-aliasing" case $host_os in + *aix*) + HOST_OS=aix + if test "`echo $CC | cut -d ' ' -f 1`" != "gcc" ; then + CFLAGS="-qnoansialias $USER_CFLAGS" + fi + AC_SUBST([PLATFORM_LDADD], ['-lperfstat -lpthread']) + ;; + *cygwin*) + HOST_OS=cygwin + ;; *darwin*) HOST_OS=darwin + HOST_ABI=macosx + # weak seed on failure to open /dev/random, based on latest + # public source: + # http://www.opensource.apple.com/source/Libc/Libc-997.90.3/gen/FreeBSD/arc4random.c + USE_BUILTIN_ARC4RANDOM=yes AC_DEFINE(SETEUID_BREAKS_SETUID,[],[setuid after seteuid does not work]) AC_DEFINE(BROKEN_SETREUID,[], [Broken setreuid]) AC_DEFINE(BROKEN_SETREGID,[], [Broken setregid]) @@ -13,33 +28,64 @@ case $host_os in ;; *freebsd*) HOST_OS=freebsd + HOST_ABI=elf + # fork detection missing, weak seed on failure + # https://svnweb.freebsd.org/base/head/lib/libc/gen/arc4random.c?revision=268642&view=markup + USE_BUILTIN_ARC4RANDOM=yes AC_SUBST([PROG_LDADD], ['-lthr']) ;; + *hpux*) + HOST_OS=hpux; + if test "`echo $CC | cut -d ' ' -f 1`" = "gcc" ; then + CFLAGS="$CFLAGS -mlp64" + else + CFLAGS="-g -O2 +DD64 +Otype_safety=off $USER_CFLAGS" + fi + CPPFLAGS="$CPPFLAGS -D_XOPEN_SOURCE=600 -D__STRICT_ALIGNMENT" + AC_SUBST([PLATFORM_LDADD], ['-lpthread']) + ;; *linux*) HOST_OS=linux - CFLAGS="$CFLAGS -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_GNU_SOURCE" + HOST_ABI=elf + CPPFLAGS="$CPPFLAGS -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_POSIX_SOURCE -D_GNU_SOURCE" AC_DEFINE([SPT_TYPE], [SPT_REUSEARGV]) ;; *netbsd*) HOST_OS=netbsd + HOST_ABI=elf + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ +#include +#if __NetBSD_Version__ < 700000001 + undefined +#endif + ]], [[]])], + [ USE_BUILTIN_ARC4RANDOM=no ], + [ USE_BUILTIN_ARC4RANDOM=yes ] + ) + CPPFLAGS="$CPPFLAGS -D_OPENBSD_SOURCE" ;; - *openbsd*) + *openbsd* | *bitrig*) HOST_OS=openbsd - AC_DEFINE([HAVE_ATTRIBUTE__BOUNDED__], [1], [OpenBSD has __bounded__]) - AC_DEFINE([HAVE_ATTRIBUTE__DEAD], [1], [OpenBSD has __dead]) + HOST_ABI=elf + AC_DEFINE([HAVE_ATTRIBUTE__BOUNDED__], [1], [OpenBSD gcc has bounded]) + AC_DEFINE([HAVE_ATTRIBUTE__DEAD], [1], [OpenBSD gcc has __dead]) ;; *solaris*) HOST_OS=solaris - CFLAGS="$CFLAGS -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -DBSD_COMP" + HOST_ABI=elf + CPPFLAGS="$CPPFLAGS -D__EXTENSIONS__ -D_XOPEN_SOURCE=600 -DBSD_COMP" AC_SUBST([PLATFORM_LDADD], ['-lnsl -lsocket']) ;; *) ;; esac +AM_CONDITIONAL([HOST_AIX], [test x$HOST_OS = xaix]) +AM_CONDITIONAL([HOST_CYGWIN], [test x$HOST_OS = xcygwin]) AM_CONDITIONAL([HOST_DARWIN], [test x$HOST_OS = xdarwin]) AM_CONDITIONAL([HOST_FREEBSD], [test x$HOST_OS = xfreebsd]) +AM_CONDITIONAL([HOST_HPUX], [test x$HOST_OS = xhpux]) AM_CONDITIONAL([HOST_LINUX], [test x$HOST_OS = xlinux]) AM_CONDITIONAL([HOST_NETBSD], [test x$HOST_OS = xnetbsd]) -AM_CONDITIONAL([HOST_OPENBSD], [test x$HOST_OS = xopenbsd]) +AM_CONDITIONAL([HOST_OPENBSD], [test x$HOST_OS = xopenbsd]) AM_CONDITIONAL([HOST_SOLARIS], [test x$HOST_OS = xsolaris]) ])