Author: robert Date: 2007-06-11 11:46:20 -0600 (Mon, 11 Jun 2007) New Revision: 1832
Added: trunk/bash/bash-3.2-arc4random-1.patch Log: Added patch for Bash to use the arc4random() library function Added: trunk/bash/bash-3.2-arc4random-1.patch =================================================================== --- trunk/bash/bash-3.2-arc4random-1.patch (rev 0) +++ trunk/bash/bash-3.2-arc4random-1.patch 2007-06-11 17:46:20 UTC (rev 1832) @@ -0,0 +1,220 @@ +Submitted By: Robert Connolly <robert at linuxfromscratch dot org> (ashes) +Date: 2007-06-11 +Initial Package Version: 3.2 +Upstream Status: Submitted - http://www.mail-archive.com/bug-bash%40gnu.org/msg02718.html +Origin: The idea came from Debian's Bash random.dpatch. See Note below. +Description: This patch uses ./configure to search for arc4random() +and use them with the "$RANDOM" Bash variable if found. + +*** Note *** +The Bash manual page states: +RANDOM Each time this parameter is referenced, a random integer between + 0 and 32767 is generated. The sequence of random numbers may be + initialized by assigning a value to RANDOM. If RANDOM is unset, + it loses its special properties, even if it is subsequently + reset. + +Coincidentally the Korn shell has the exact same behavior, but this is +not defined by Posix standards. + +In all cases `echo $RANDOM` will change each time, if 'RANDOM' is not +initialized. The vanilla Bash uses OLD_RANDOM+getpid()+gettimeofday(). +This patch uses arc4random() when 'RANDOM' is not initialized, which +makes the returned value much more difficult to predict. + +Vanilla Bash, and the Bash using this patch: + +$ RANDOM=1 +$ echo $RANDOM +16838 +$ RANDOM=1 +$ echo $RANDOM +16838 +$ RANDOM=1 +$ echo $RANDOM +16838 +$ RANDOM=2 +$ echo $RANDOM +908 +$ RANDOM=3 +$ echo $RANDOM +17747 +$ RANDOM=2 +$ echo $RANDOM +908 + +This is the documented and expected behavior of the shell. Any Bash, +assuming the versions are the same, should produce "17747" if 'RANDOM=3', +and so on. + +From the Debian random patch: + +$ RANDOM=1 +$ echo $RANDOM +17767 +$ RANDOM=1 +$ echo $RANDOM +9158 +$ RANDOM=1 +$ echo $RANDOM +17767 +$ RANDOM=1 +$ echo $RANDOM +9158 + +This breaks the expected behavior. + +diff -Naur bash-3.2.orig/config.h.in bash-3.2/config.h.in +--- bash-3.2.orig/config.h.in 2006-09-12 20:00:54.000000000 +0000 ++++ bash-3.2/config.h.in 2007-04-26 04:49:04.000000000 +0000 +@@ -496,6 +496,9 @@ + + /* Presence of system and C library functions. */ + ++/* Define if you have the arc4random function. */ ++#undef HAVE_ARC4RANDOM ++ + /* Define if you have the asprintf function. */ + #undef HAVE_ASPRINTF + +diff -Naur bash-3.2.orig/configure bash-3.2/configure +--- bash-3.2.orig/configure 2006-09-26 15:06:01.000000000 +0000 ++++ bash-3.2/configure 2007-04-26 04:53:44.000000000 +0000 +@@ -14542,6 +14542,109 @@ + + + ++for ac_func in arc4random ++do ++as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` ++echo "$as_me:$LINENO: checking for $ac_func" >&5 ++echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 ++if eval "test \"\${$as_ac_var+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. */ ++/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. ++ For example, HP-UX 11i <limits.h> declares gettimeofday. */ ++#define $ac_func innocuous_$ac_func ++ ++/* System header to define __stub macros and hopefully few prototypes, ++ which can conflict with char $ac_func (); below. ++ Prefer <limits.h> to <assert.h> if __STDC__ is defined, since ++ <limits.h> exists even on freestanding compilers. */ ++ ++#ifdef __STDC__ ++# include <limits.h> ++#else ++# include <assert.h> ++#endif ++ ++#undef $ac_func ++ ++/* Override any gcc2 internal prototype to avoid an error. */ ++#ifdef __cplusplus ++extern "C" ++{ ++#endif ++/* We use char because int might match the return type of a gcc2 ++ builtin and then its argument prototype would still apply. */ ++char $ac_func (); ++/* The GNU C library defines this for functions which it implements ++ to always fail with ENOSYS. Some functions are actually named ++ something starting with __ and the normal name is an alias. */ ++#if defined (__stub_$ac_func) || defined (__stub___$ac_func) ++choke me ++#else ++char (*f) () = $ac_func; ++#endif ++#ifdef __cplusplus ++} ++#endif ++ ++int ++main () ++{ ++return f != $ac_func; ++ ; ++ return 0; ++} ++_ACEOF ++rm -f conftest.$ac_objext conftest$ac_exeext ++if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ++ (eval $ac_link) 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' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; } && ++ { ac_try='test -s conftest$ac_exeext' ++ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 ++ (eval $ac_try) 2>&5 ++ ac_status=$? ++ echo "$as_me:$LINENO: \$? = $ac_status" >&5 ++ (exit $ac_status); }; }; then ++ eval "$as_ac_var=yes" ++else ++ echo "$as_me: failed program was:" >&5 ++sed 's/^/| /' conftest.$ac_ext >&5 ++ ++eval "$as_ac_var=no" ++fi ++rm -f conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++fi ++echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 ++echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 ++if test `eval echo '${'$as_ac_var'}'` = yes; then ++ cat >>confdefs.h <<_ACEOF ++#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 ++_ACEOF ++ ++fi ++done ++ ++ ++ + + + +diff -Naur bash-3.2.orig/configure.in bash-3.2/configure.in +--- bash-3.2.orig/configure.in 2006-09-26 15:05:45.000000000 +0000 ++++ bash-3.2/configure.in 2007-04-26 04:49:26.000000000 +0000 +@@ -748,6 +748,9 @@ + + AC_FUNC_MKTIME + ++dnl Checks for the arc4random function ++AC_CHECK_FUNCS(arc4random) ++ + dnl + dnl Checks for lib/intl and related code (uses some of the output from + dnl AM_GNU_GETTEXT) +diff -Naur bash-3.2.orig/variables.c bash-3.2/variables.c +--- bash-3.2.orig/variables.c 2006-09-08 17:33:32.000000000 +0000 ++++ bash-3.2/variables.c 2007-04-26 04:53:27.000000000 +0000 +@@ -1188,7 +1188,11 @@ + /* Reset for command and process substitution. */ + if (subshell_environment && seeded_subshell == 0) + { ++#if defined(HAVE_ARC4RANDOM) ++ sbrand (arc4random()); ++#else + sbrand (rseed + getpid() + NOW); ++#endif + seeded_subshell = 1; + } + -- http://linuxfromscratch.org/mailman/listinfo/patches FAQ: http://www.linuxfromscratch.org/faq/ Unsubscribe: See the above information page
