Commit edabe3d8 by Alexander Monakov

toplev: read from /dev/urandom only when needed

	* toplev.h (set_random_seed): Adjust return type.
	* toplev.c (init_local_tick): Move eager initialization of random_seed
	to get_random_seed.  Adjust comment.
	(init_random_seed): Inline to get_random_seed, delete.
	(get_random_seed): Initialize random_seed lazily.
	(set_random_seed): Do not return previous value.
	(print_switch_value): Do not call get_random_seed.

From-SVN: r253069
parent 9acb4592
2017-09-21 Evgeny Kudryashov <kudryashov@ispras.ru> 2017-09-21 Alexander Monakov <amonakov@ispras.ru>
* toplev.h (set_random_seed): Adjust return type.
* toplev.c (init_local_tick): Move eager initialization of random_seed
to get_random_seed. Adjust comment.
(init_random_seed): Inline to get_random_seed, delete.
(get_random_seed): Initialize random_seed lazily.
(set_random_seed): Do not return previous value.
(print_switch_value): Do not call get_random_seed.
2017-09-21 Evgeny Kudryashov <kudryashov@ispras.ru>
* cgraph.c (delete_function_version): New, broken out from... * cgraph.c (delete_function_version): New, broken out from...
(cgraph_node::delete_function_version): ...here. Rename to (cgraph_node::delete_function_version): ...here. Rename to
...@@ -239,7 +239,7 @@ announce_function (tree decl) ...@@ -239,7 +239,7 @@ announce_function (tree decl)
} }
} }
/* Initialize local_tick with a random number or -1 if /* Initialize local_tick with the time of day, or -1 if
flag_random_seed is set. */ flag_random_seed is set. */
static void static void
...@@ -247,19 +247,6 @@ init_local_tick (void) ...@@ -247,19 +247,6 @@ init_local_tick (void)
{ {
if (!flag_random_seed) if (!flag_random_seed)
{ {
/* Try urandom first. Time of day is too likely to collide.
In case of any error we just use the local tick. */
int fd = open ("/dev/urandom", O_RDONLY);
if (fd >= 0)
{
if (read (fd, &random_seed, sizeof (random_seed))
!= sizeof (random_seed))
random_seed = 0;
close (fd);
}
/* Now get the tick anyways */
#ifdef HAVE_GETTIMEOFDAY #ifdef HAVE_GETTIMEOFDAY
{ {
struct timeval tv; struct timeval tv;
...@@ -280,34 +267,33 @@ init_local_tick (void) ...@@ -280,34 +267,33 @@ init_local_tick (void)
local_tick = -1; local_tick = -1;
} }
/* Set up a default flag_random_seed and local_tick, unless the user
already specified one. Must be called after init_local_tick. */
static void
init_random_seed (void)
{
if (!random_seed)
random_seed = local_tick ^ getpid (); /* Old racey fallback method */
}
/* Obtain the random_seed. Unless NOINIT, initialize it if /* Obtain the random_seed. Unless NOINIT, initialize it if
it's not provided in the command line. */ it's not provided in the command line. */
HOST_WIDE_INT HOST_WIDE_INT
get_random_seed (bool noinit) get_random_seed (bool noinit)
{ {
if (!flag_random_seed && !noinit) if (!random_seed && !noinit)
init_random_seed (); {
int fd = open ("/dev/urandom", O_RDONLY);
if (fd >= 0)
{
if (read (fd, &random_seed, sizeof (random_seed))
!= sizeof (random_seed))
random_seed = 0;
close (fd);
}
if (!random_seed)
random_seed = local_tick ^ getpid ();
}
return random_seed; return random_seed;
} }
/* Modify the random_seed string to VAL. Return its previous /* Set flag_random_seed to VAL, and if non-null, reinitialize random_seed. */
value. */
const char * void
set_random_seed (const char *val) set_random_seed (const char *val)
{ {
const char *old = flag_random_seed;
flag_random_seed = val; flag_random_seed = val;
if (flag_random_seed) if (flag_random_seed)
{ {
...@@ -318,7 +304,6 @@ set_random_seed (const char *val) ...@@ -318,7 +304,6 @@ set_random_seed (const char *val)
if (!(endp > flag_random_seed && *endp == 0)) if (!(endp > flag_random_seed && *endp == 0))
random_seed = crc32_string (0, flag_random_seed); random_seed = crc32_string (0, flag_random_seed);
} }
return old;
} }
/* Handler for fatal signals, such as SIGSEGV. These are transformed /* Handler for fatal signals, such as SIGSEGV. These are transformed
...@@ -818,11 +803,6 @@ print_switch_values (print_switch_fn_type print_fn) ...@@ -818,11 +803,6 @@ print_switch_values (print_switch_fn_type print_fn)
int pos = 0; int pos = 0;
size_t j; size_t j;
/* Fill in the -frandom-seed option, if the user didn't pass it, so
that it can be printed below. This helps reproducibility. */
if (!flag_random_seed)
init_random_seed ();
/* Print the options as passed. */ /* Print the options as passed. */
pos = print_single_switch (print_fn, pos, pos = print_single_switch (print_fn, pos,
SWITCH_TYPE_DESCRIPTIVE, _("options passed: ")); SWITCH_TYPE_DESCRIPTIVE, _("options passed: "));
......
...@@ -91,7 +91,7 @@ extern bool set_src_pwd (const char *); ...@@ -91,7 +91,7 @@ extern bool set_src_pwd (const char *);
/* Functions used to manipulate the random seed. */ /* Functions used to manipulate the random seed. */
extern HOST_WIDE_INT get_random_seed (bool); extern HOST_WIDE_INT get_random_seed (bool);
extern const char *set_random_seed (const char *); extern void set_random_seed (const char *);
extern void initialize_rtl (void); extern void initialize_rtl (void);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment