Messages in this thread | | | From | "Jason A. Donenfeld" <> | Date | Thu, 2 Dec 2021 11:55:10 -0500 | Subject | Re: [PATCH v3, resend] random: fix crash on multiple early calls to add_bootloader_randomness() |
| |
Hi Dominik,
Thanks for the patch. One trivial nit and one question:
On Thu, Dec 2, 2021 at 6:35 AM Dominik Brodowski <linux@dominikbrodowski.net> wrote: > + /* We cannot do much with the input pool until it is set up in > + * rand_initalize(); therefore just mix into the crng state.
I think you meant "rand_initialize()" here (missing 'i').
> If the added entropy suffices to increase crng_init to 1, future calls > to add_bootloader_randomness() or add_hwgenerator_randomness() used to > progress to credit_entropy_bits(). However, if the input pool is not yet > properly set up, the cmpxchg call within that function can lead to an > infinite recursion.
I see what this patch does with crng_global_init_time, and that seems probably sensible, but I didn't understand this part of the reasoning in the commit message; I might just be a bit slow here. Where's the recursion exactly? Or even an infinite loop?
As far as I can tell, that portion of credit_entropy_bits() breaks down as:
retry: entropy_count = orig = READ_ONCE(r->entropy_count); [ ... do some arithmetic on entropy_count ... ] if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig) goto retry;
Why would this be infinite? Why wouldn't the cmpxchg eventually converge to a stable value? I don't see any call that modifies r->entropy_count or orig from inside that block. Is there some other super-spinny concurrent operation?
Thanks, Jason
| |