FAILED: patch "[PATCH] gcc-plugins: latent_entropy: use /dev/urandom" failed to apply to 4.9-stable tree
Subsystems (2)
[email protected]
maintainerThe patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From c40160f2998c897231f8454bf797558d30a20375 Mon Sep 17 00:00:00 2001
From: "Jason A. Donenfeld" <[email protected]>
Date: Wed, 6 Apr 2022 00:28:15 +0200
Subject: [PATCH] gcc-plugins: latent_entropy: use /dev/urandom
While the latent entropy plugin mostly doesn't derive entropy from get_random_const() for measuring the call graph, when __latent_entropy is applied to a constant, then it's initialized statically to output from get_random_const(). In that case, this data is derived from a 64-bit seed, which means a buffer of 512 bits doesn't really have that amount of compile-time entropy.
This patch fixes that shortcoming by just buffering chunks of /dev/urandom output and doling it out as requested.
At the same time, it's important that we don't break the use of -frandom-seed, for people who want the runtime benefits of the latent entropy plugin, while still having compile-time determinism. In that case, we detect whether gcc's set_random_seed() has been called by making a call to get_random_seed(noinit=true) in the plugin init function, which is called after set_random_seed() is called but before anything that calls get_random_seed(noinit=false), and seeing if it's zero or not. If it's not zero, we're in deterministic mode, and so we just generate numbers with a basic xorshift prng.
Note that we don't detect if -frandom-seed is being used using the documented local_tick variable, because it's assigned via:
local_tick = (unsigned) tv.tv_sec * 1000 + tv.tv_usec / 1000;
which may well overflow and become -1 on its own, and so isn't
reliable: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=105171
[kees: The 256 byte rnd_buf size was chosen based on average (250),
median (64), and std deviation (575) bytes of used entropy for a defconfig x86_64 build]
scripts/gcc-plugins/latent_entropy_plugin.c +27 -17
@@ -86,25 +86,31 @@ static struct plugin_info latent_entropy_plugin_info = { .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,
Hi Greg,
Quoted 6 lines · On Mon, Apr 18, 2022 at 10:10:45AM +0200, [email protected] wrote:
The patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
Quoted 7 lines
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From
c40160f2998c897231f8454bf797558d30a20375Mon Sep 17 00:00:00 2001
Apparently on 4.9.y, applying this commit cleanly also requires 5a45a4c5c3f5e36a03770deb102ca6ba256ff3d7 to be cherry picked first.
Jason
Greg KH
maintainerQuoted 11 lines · Jason A. Donenfeld
Hi Greg,
Quoted 8 lines · On Mon, Apr 18, 2022 at 10:10:45AM +0200, [email protected] wrote:
The patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
Quoted 8 lines
Quoted 5 lines
greg k-h
------------------ original commit in Linus's tree ------------------
From
c40160f2998c897231f8454bf797558d30a20375Mon Sep 17 00:00:00 2001Apparently on 4.9.y, applying this commit cleanly also requires
5a45a4c5c3f5e36a03770deb102ca6ba256ff3d7to be cherry picked first.
That worked, thanks!
Hi Greg,
Quoted 14 lines · Greg KH
Quoted 13 lines · Jason A. Donenfeld
Hi Greg,
Quoted 10 lines · On Mon, Apr 18, 2022 at 10:10:45AM +0200, [email protected] wrote:
The patch below does not apply to the 4.9-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.thanks,
greg k-h
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines
------------------ original commit in Linus's tree ------------------
From
c40160f2998c897231f8454bf797558d30a20375Mon Sep 17 00:00:00 2001Apparently on 4.9.y, applying this commit cleanly also requires
5a45a4c5c3f5e36a03770deb102ca6ba256ff3d7to be cherry picked first.That worked, thanks!
Hold up a second; that won't actually compile. Sorry about that, I'm doing this all on my phone and a bit slow.
I'll do a standalone backport of c40160f without 5a45a4, and will mail it out shortly.
Jason