From 44a22bdb40386dd07306f2b8a3335ed360d99517 Mon Sep 17 00:00:00 2001 From: Andi Kleen Date: Thu, 29 Sep 2011 13:15:29 +0000 Subject: [PATCH] Use urandom in gcc.c too gcc also takes generates a random number in some special circumstances, so teach it about /dev/urandom too. gcc/: 2011-09-27 Andi Kleen * gcc.c (get_local_tick). Rename to get_random_number. Read from /dev/urandom. Add getpid call. (compare_debug_dump_opt_spec_function): Drop getpid call. From-SVN: r179349 --- gcc/ChangeLog | 7 +++++++ gcc/gcc.c | 22 ++++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 67afcd5ceb1..465ce0d03b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-09-27 Andi Kleen + + * gcc.c (get_local_tick). Rename to get_random_number. + Read from /dev/urandom. + Add getpid call. + (compare_debug_dump_opt_spec_function): Drop getpid call. + 2011-09-26 Andi Kleen * toplev.c (init_local_tick): Try reading random seed from /dev/urandom diff --git a/gcc/gcc.c b/gcc/gcc.c index ddec8db706b..3bfdf77b401 100644 --- a/gcc/gcc.c +++ b/gcc/gcc.c @@ -8062,12 +8062,22 @@ print_asm_header_spec_function (int arg ATTRIBUTE_UNUSED, return NULL; } -/* Compute a timestamp to initialize flag_random_seed. */ +/* Get a random number for -frandom-seed */ -static unsigned -get_local_tick (void) +static unsigned HOST_WIDE_INT +get_random_number (void) { - unsigned ret = 0; + unsigned HOST_WIDE_INT ret = 0; + int fd; + + fd = open ("/dev/urandom", O_RDONLY); + if (fd >= 0) + { + read (fd, &ret, sizeof (HOST_WIDE_INT)); + close (fd); + if (ret) + return ret; + } /* Get some more or less random data. */ #ifdef HAVE_GETTIMEOFDAY @@ -8086,7 +8096,7 @@ get_local_tick (void) } #endif - return ret; + return ret ^ getpid(); } /* %:compare-debug-dump-opt spec function. Save the last argument, @@ -8145,7 +8155,7 @@ compare_debug_dump_opt_spec_function (int arg, if (!which) { - unsigned HOST_WIDE_INT value = get_local_tick () ^ getpid (); + unsigned HOST_WIDE_INT value = get_random_number (); sprintf (random_seed, HOST_WIDE_INT_PRINT_HEX, value); } -- 2.11.4.GIT