diff options
Diffstat (limited to 'scripts/gcc-plugins/latent_entropy_plugin.c')
| -rw-r--r-- | scripts/gcc-plugins/latent_entropy_plugin.c | 46 | 
1 files changed, 28 insertions, 18 deletions
| diff --git a/scripts/gcc-plugins/latent_entropy_plugin.c b/scripts/gcc-plugins/latent_entropy_plugin.c index 589454bce930..5d415b2572a8 100644 --- a/scripts/gcc-plugins/latent_entropy_plugin.c +++ b/scripts/gcc-plugins/latent_entropy_plugin.c @@ -82,29 +82,35 @@ __visible int plugin_is_GPL_compatible;  static GTY(()) tree latent_entropy_decl;  static struct plugin_info latent_entropy_plugin_info = { -	.version	= "201606141920vanilla", +	.version	= UTS_RELEASE,  	.help		= "disable\tturn off latent entropy instrumentation\n",  }; -static unsigned HOST_WIDE_INT seed; -/* - * get_random_seed() (this is a GCC function) generates the seed. - * This is a simple random generator without any cryptographic security because - * the entropy doesn't come from here. - */ +static unsigned HOST_WIDE_INT deterministic_seed; +static unsigned HOST_WIDE_INT rnd_buf[32]; +static size_t rnd_idx = ARRAY_SIZE(rnd_buf); +static int urandom_fd = -1; +  static unsigned HOST_WIDE_INT get_random_const(void)  { -	unsigned int i; -	unsigned HOST_WIDE_INT ret = 0; - -	for (i = 0; i < 8 * sizeof(ret); i++) { -		ret = (ret << 1) | (seed & 1); -		seed >>= 1; -		if (ret & 1) -			seed ^= 0xD800000000000000ULL; +	if (deterministic_seed) { +		unsigned HOST_WIDE_INT w = deterministic_seed; +		w ^= w << 13; +		w ^= w >> 7; +		w ^= w << 17; +		deterministic_seed = w; +		return deterministic_seed;  	} -	return ret; +	if (urandom_fd < 0) { +		urandom_fd = open("/dev/urandom", O_RDONLY); +		gcc_assert(urandom_fd >= 0); +	} +	if (rnd_idx >= ARRAY_SIZE(rnd_buf)) { +		gcc_assert(read(urandom_fd, rnd_buf, sizeof(rnd_buf)) == sizeof(rnd_buf)); +		rnd_idx = 0; +	} +	return rnd_buf[rnd_idx++];  }  static tree tree_get_random_const(tree type) @@ -537,8 +543,6 @@ static void latent_entropy_start_unit(void *gcc_data __unused,  	tree type, id;  	int quals; -	seed = get_random_seed(false); -  	if (in_lto_p)  		return; @@ -573,6 +577,12 @@ __visible int plugin_init(struct plugin_name_args *plugin_info,  	const struct plugin_argument * const argv = plugin_info->argv;  	int i; +	/* +	 * Call get_random_seed() with noinit=true, so that this returns +	 * 0 in the case where no seed has been passed via -frandom-seed. +	 */ +	deterministic_seed = get_random_seed(true); +  	static const struct ggc_root_tab gt_ggc_r_gt_latent_entropy[] = {  		{  			.base = &latent_entropy_decl, |