Skip to content

Commit

Permalink
Fix configure to find arc4random via header files.
Browse files Browse the repository at this point in the history
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]


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200819 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
tfiala-goog committed Feb 5, 2014
1 parent 9e849c7 commit 9cd9208
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 9 deletions.
5 changes: 4 additions & 1 deletion autoconf/configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -1757,13 +1757,16 @@ AC_CHECK_FUNCS([log log2 log10 exp exp2])
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])

Expand Down
2 changes: 1 addition & 1 deletion cmake/config-ix.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ if( NOT PURE_WINDOWS )
endif()

# function checks
check_symbol_exists(arc4random "stdlib.h" HAVE_ARC4RANDOM)
check_symbol_exists(arc4random "stdlib.h" HAVE_DECL_ARC4RANDOM)
check_symbol_exists(backtrace "execinfo.h" HAVE_BACKTRACE)
check_symbol_exists(getpagesize unistd.h HAVE_GETPAGESIZE)
check_symbol_exists(getrusage sys/resource.h HAVE_GETRUSAGE)
Expand Down
90 changes: 88 additions & 2 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -18527,8 +18527,7 @@ done




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
Expand Down Expand Up @@ -19161,6 +19160,93 @@ _ACEOF
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
Expand Down
7 changes: 4 additions & 3 deletions include/llvm/Config/config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions lib/Support/Unix/Process.inc
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ const char *Process::ResetColor() {
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")) {
Expand All @@ -364,7 +364,7 @@ static unsigned GetRandomNumberSeed() {
#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);
Expand Down

0 comments on commit 9cd9208

Please sign in to comment.