From ab4ea8c3a26832f42bc9b6d0e1a071c9e454cd2a Mon Sep 17 00:00:00 2001 From: Pete Graner Date: Aug 15 2007 16:47:18 +0000 Subject: - Improve bash $RANDOM pseudo RNG (bug #234906) --- diff --git a/bash-3.2-rng.patch b/bash-3.2-rng.patch new file mode 100644 index 0000000..4798f20 --- /dev/null +++ b/bash-3.2-rng.patch @@ -0,0 +1,169 @@ +--- bash-3.2/configure.in.rng 2007-04-05 11:07:40.000000000 +0200 ++++ bash-3.2/configure.in 2007-04-05 11:07:41.000000000 +0200 +@@ -111,6 +111,7 @@ + AC_ARG_WITH(installed-readline, AC_HELP_STRING([--with-installed-readline], [use a version of the readline library that is already installed]), opt_with_installed_readline=$withval) + AC_ARG_WITH(purecov, AC_HELP_STRING([--with-purecov], [configure to postprocess with pure coverage]), opt_purecov=$withval) + AC_ARG_WITH(purify, AC_HELP_STRING([--with-purify], [configure to postprocess with purify]), opt_purify=$withval) ++AC_ARG_WITH(random, AC_HELP_STRING([--with-randomdev=path], [use specified random device instead of /dev/urandom]), opt_randomdev=$withval) + + if test "$opt_bash_malloc" = yes; then + MALLOC_TARGET=malloc +@@ -152,6 +153,15 @@ + DEBUGGER_START_FILE=${ac_default_prefix}/share/bashdb/bashdb-main.inc + fi + ++if test "$opt_randomdev" = yes -o -z "$opt_randomdev"; then ++ opt_randomdev="/dev/urandom" ++elif test "$opt_randomdev" = no; then ++ opt_randomdev= ++fi ++if test -n "$opt_randomdev"; then ++ AC_DEFINE_UNQUOTED(PATH_RANDOMDEV, "$opt_randomdev", [Random device path.]) ++fi ++ + dnl optional shell features in config.h.in + opt_minimal_config=no + +@@ -708,6 +718,8 @@ + setenv setlinebuf setlocale setvbuf siginterrupt strchr \ + sysconf tcgetattr times ttyname tzset unsetenv) + ++AC_CHECK_FUNCS(random srandom) ++ + AC_CHECK_FUNCS(vsnprintf snprintf vasprintf asprintf) + AC_CHECK_FUNCS(isascii isblank isgraph isprint isspace isxdigit) + AC_CHECK_FUNCS(getpwent getpwnam getpwuid) +--- bash-3.2/config.h.in.rng 2007-04-05 11:07:40.000000000 +0200 ++++ bash-3.2/config.h.in 2007-04-05 11:07:41.000000000 +0200 +@@ -203,6 +203,8 @@ + + #define DEFAULT_MAIL_DIRECTORY "/var/spool/mail" + ++#undef PATH_RANDOMDEV ++ + /* Characteristics of the system's header files and libraries that affect + the compilation environment. */ + +@@ -815,6 +817,10 @@ + /* Define if you have the wcwidth function. */ + #undef HAVE_WCWIDTH + ++#undef HAVE_RANDOM ++ ++#undef HAVE_SRANDOM ++ + /* Presence of certain system include files. */ + + /* Define if you have the header file. */ +--- bash-3.2/variables.c.rng 2006-09-08 19:33:32.000000000 +0200 ++++ bash-3.2/variables.c 2007-04-05 11:53:03.000000000 +0200 +@@ -42,6 +42,11 @@ + #include "bashansi.h" + #include "bashintl.h" + ++#if defined (PATH_RANDOMDEV) ++# include ++# include "filecntl.h" ++#endif ++ + #include "shell.h" + #include "flags.h" + #include "execute_cmd.h" +@@ -182,7 +187,8 @@ + static SHELL_VAR *init_seconds_var __P((void)); + + static int brand __P((void)); +-static void sbrand __P((unsigned long)); /* set bash random number generator. */ ++static void sbrand __P((unsigned int)); /* set bash random number generator. */ ++static void seed_random __P((void)); /* seed the generator randomly */ + static SHELL_VAR *assign_random __P((SHELL_VAR *, char *, arrayind_t)); + static SHELL_VAR *get_random __P((SHELL_VAR *)); + +@@ -495,7 +501,7 @@ + #endif /* HISTORY */ + + /* Seed the random number generator. */ +- sbrand (dollar_dollar_pid + shell_start_time); ++ seed_random(); + + /* Handle some "special" variables that we may have inherited from a + parent shell. */ +@@ -1143,7 +1149,9 @@ + } + + /* The random number seed. You can change this by setting RANDOM. */ ++#if !defined (HAVE_RANDOM) + static unsigned long rseed = 1; ++#endif + static int last_random_value; + static int seeded_subshell = 0; + +@@ -1155,26 +1163,56 @@ + static int + brand () + { ++#if defined (HAVE_RANDOM) ++ unsigned int rseed; ++ rseed = random(); ++#else + rseed = rseed * 1103515245 + 12345; ++#endif + return ((unsigned int)((rseed >> 16) & 32767)); /* was % 32768 */ + } +- + /* Set the random number generator seed to SEED. */ + static void + sbrand (seed) +- unsigned long seed; ++ unsigned int seed; + { ++#if defined (HAVE_RANDOM) ++ srandom((unsigned int)seed); ++#else + rseed = seed; ++#endif + last_random_value = 0; + } + ++static void ++seed_random () ++{ ++ unsigned int seed; ++#if defined (PATH_RANDOMDEV) ++ int fd; ++ int rv; ++ if ((rv = fd = open (PATH_RANDOMDEV, O_RDONLY)) != -1) { ++ while ((rv = read(fd, &seed, sizeof(seed))) != sizeof(seed) && errno == EINTR); ++ close (fd); ++ } ++ if (rv != sizeof(seed)) { ++#endif ++ struct timeval tv; ++ gettimeofday(&tv, NULL); ++ seed = (unsigned int)tv.tv_sec + (unsigned int)tv.tv_usec + getpid(); ++#if defined (PATH_RANDOMDEV) ++ } ++#endif ++ sbrand (seed); ++} ++ + static SHELL_VAR * + assign_random (self, value, unused) + SHELL_VAR *self; + char *value; + arrayind_t unused; + { +- sbrand (strtoul (value, (char **)NULL, 10)); ++ sbrand ((unsigned int)strtoul (value, (char **)NULL, 10)); + if (subshell_environment) + seeded_subshell = 1; + return (self); +@@ -1188,7 +1226,7 @@ + /* Reset for command and process substitution. */ + if (subshell_environment && seeded_subshell == 0) + { +- sbrand (rseed + getpid() + NOW); ++ seed_random (); + seeded_subshell = 1; + } + diff --git a/bash.spec b/bash.spec index f6a4c4f..2c726e8 100644 --- a/bash.spec +++ b/bash.spec @@ -1,7 +1,7 @@ Version: 3.2 Name: bash Summary: The GNU Bourne Again shell (bash) version %{version} -Release: 12%{?dist} +Release: 13%{?dist} Group: System Environment/Shells License: GPL Url: http://www.gnu.org/software/bash @@ -44,6 +44,7 @@ Patch126: bash-setlocale.patch Patch130: bash-infotags.patch Patch131: bash-cond-rmatch.patch Patch132: bash-ulimit-m.patch +Patch131: bash-3.2-rng.patch Requires: mktemp Requires(post): ncurses BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) @@ -97,6 +98,7 @@ compliance over previous versions. %patch130 -p1 -b .infotags %patch131 -p1 -b .cond-rmatch %patch132 -p1 -b .ulimit-m +%patch131 -p1 -b .rng.patch echo %{version} > _distribution echo %{release} > _patchlevel @@ -238,6 +240,9 @@ fi %doc doc/*.ps doc/*.0 doc/*.html doc/article.txt %changelog +* Wed Aug 15 2007 Pete Graner - 3.2-13 +- Improve bash $RANDOM pseudo RNG (bug #234906) + * Fri Jul 20 2007 Tim Waugh 3.2-12 - Quote environment variables in the post scriptlet to prevent upgrade failures (bug #249005).