[PATCH] change llvm configure arc4random presence test to fix broken configuration

Todd Fiala tfiala at google.com
Tue Feb 4 16:03:29 PST 2014


ISSUE:

On Ubuntu 12.04 LTS, arc4random is provided by libbsd.so, which is a
transitive dependency of libedit.  If a system had libedit on it that was
implemented in terms of libbsd.so, then the arc4random test, previously
implemented as a linker test, would succeed with -ledit.  However, on
Ubuntu this would also require a #include <bsd/stdlib.h>.  This caused a
build breakage on configure-based Ubuntu 12.04 with libedit installed.

FIX:

This fix changes configure to test for arc4random by searching for it in
the standard header files.  On Ubuntu 12.04, this test now properly fails
to find arc4random as it is not defined in the default header locations.
 It also tweaks the #define names to match the output of the header check
command, which is slightly different than the linker function check
#defines.

I tested the following scenarios:

(1) Ubuntu 12.04 without the libedit package [did not find arc4random, as
expected]

(2) Ubuntu 12.04 with libedit package [properly did not find arc4random, as
expected]

(3) Ubuntu 12.04 with most recent libedit, custom built, and not dependent
on libbsd.so [properly did not find arc4random, as expected].

(4) FreeBSD 10.0B1 [properly found arc4random, as expected]

Let me know what you think.  Thanks!
-- 
Todd Fiala | Software Engineer | tfiala at google.com | 650-943-3180
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140204/a3b285bc/attachment.html>
-------------- next part --------------
Index: autoconf/configure.ac
===================================================================
--- autoconf/configure.ac	(revision 200725)
+++ autoconf/configure.ac	(working copy)
@@ -1757,13 +1757,16 @@
 AC_CHECK_FUNCS([getpagesize getrusage getrlimit setrlimit gettimeofday ])
 AC_CHECK_FUNCS([isatty mkdtemp mkstemp ])
 AC_CHECK_FUNCS([mktemp posix_spawn pread realpath sbrk setrlimit ])
-AC_CHECK_FUNCS([strerror strerror_r setenv arc4random ])
+AC_CHECK_FUNCS([strerror strerror_r setenv ])
 AC_CHECK_FUNCS([strtoll strtoq sysconf malloc_zone_statistics ])
 AC_CHECK_FUNCS([setjmp longjmp sigsetjmp siglongjmp writev])
 AC_CHECK_FUNCS([futimes futimens])
 AC_C_PRINTF_A
 AC_FUNC_RAND48
 
+dnl Check for arc4random accessible via AC_INCLUDES_DEFAULT.
+AC_CHECK_DECLS([arc4random])
+
 dnl Check the declaration "Secure API" on Windows environments.
 AC_CHECK_DECLS([strerror_s])
 
Index: configure
===================================================================
--- configure	(revision 200725)
+++ configure	(working copy)
@@ -18527,8 +18527,7 @@
 
 
 
-
-for ac_func in strerror strerror_r setenv arc4random
+for ac_func in strerror strerror_r setenv
 do
 as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
 { echo "$as_me:$LINENO: checking for $ac_func" >&5
@@ -19161,6 +19160,93 @@
 fi
 
 
+{ echo "$as_me:$LINENO: checking whether arc4random is declared" >&5
+echo $ECHO_N "checking whether arc4random is declared... $ECHO_C" >&6; }
+if test "${ac_cv_have_decl_arc4random+set}" = set; then
+  echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+  cat >conftest.$ac_ext <<_ACEOF
+/* confdefs.h.  */
+_ACEOF
+cat confdefs.h >>conftest.$ac_ext
+cat >>conftest.$ac_ext <<_ACEOF
+/* end confdefs.h.  */
+$ac_includes_default
+int
+main ()
+{
+#ifndef arc4random
+  char *p = (char *) arc4random;
+  return !p;
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (ac_try="$ac_compile"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_compile") 2>conftest.er1
+  ac_status=$?
+  grep -v '^ *+' conftest.er1 >conftest.err
+  rm -f conftest.er1
+  cat conftest.err >&5
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); } &&
+	 { ac_try='test -z "$ac_c_werror_flag" || test ! -s conftest.err'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; } &&
+	 { ac_try='test -s conftest.$ac_objext'
+  { (case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
+  (exit $ac_status); }; }; then
+  ac_cv_have_decl_arc4random=yes
+else
+  echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_cv_have_decl_arc4random=no
+fi
+
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+{ echo "$as_me:$LINENO: result: $ac_cv_have_decl_arc4random" >&5
+echo "${ECHO_T}$ac_cv_have_decl_arc4random" >&6; }
+if test $ac_cv_have_decl_arc4random = yes; then
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ARC4RANDOM 1
+_ACEOF
+
+
+else
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_ARC4RANDOM 0
+_ACEOF
+
+
+fi
+
+
+
 { echo "$as_me:$LINENO: checking whether strerror_s is declared" >&5
 echo $ECHO_N "checking whether strerror_s is declared... $ECHO_C" >&6; }
 if test "${ac_cv_have_decl_strerror_s+set}" = set; then
Index: include/llvm/Config/config.h.in
===================================================================
--- include/llvm/Config/config.h.in	(revision 200725)
+++ include/llvm/Config/config.h.in	(working copy)
@@ -33,9 +33,6 @@
 /* Directory where gcc is installed. */
 #undef GCC_INSTALL_PREFIX
 
-/* Define to 1 if you have the `arc4random' function. */
-#undef HAVE_ARC4RANDOM
-
 /* Define to 1 if you have the `argz_append' function. */
 #undef HAVE_ARGZ_APPEND
 
@@ -75,6 +72,10 @@
 /* Define to 1 if you have the <cxxabi.h> header file. */
 #undef HAVE_CXXABI_H
 
+/* Define to 1 if you have the declaration of `arc4random', and to 0 if you
+   don't. */
+#undef HAVE_DECL_ARC4RANDOM
+
 /* Define to 1 if you have the declaration of `FE_ALL_EXCEPT', and to 0 if you
    don't. */
 #undef HAVE_DECL_FE_ALL_EXCEPT
Index: lib/Support/Unix/Process.inc
===================================================================
--- lib/Support/Unix/Process.inc	(revision 200725)
+++ lib/Support/Unix/Process.inc	(working copy)
@@ -343,7 +343,7 @@
   return "\033[0m";
 }
 
-#if !defined(HAVE_ARC4RANDOM)
+#if !defined(HAVE_DECL_ARC4RANDOM) || !HAVE_DECL_ARC4RANDOM
 static unsigned GetRandomNumberSeed() {
   // Attempt to get the initial seed from /dev/urandom, if possible.
   if (FILE *RandomSource = ::fopen("/dev/urandom", "r")) {
@@ -364,7 +364,7 @@
 #endif
 
 unsigned llvm::sys::Process::GetRandomNumber() {
-#if defined(HAVE_ARC4RANDOM)
+#if defined(HAVE_DECL_ARC4RANDOM) && HAVE_DECL_ARC4RANDOM
   return arc4random();
 #else
   static int x = (::srand(GetRandomNumberSeed()), 0);


More information about the llvm-commits mailing list