X-Git-Url: http://pileus.org/git/?p=~andy%2Flinux;a=blobdiff_plain;f=lib%2Frandom32.c;h=61489677870007e273301209438ac4913562b140;hp=1e5b2df442916de82ef497f844c068724f8cd555;hb=05efa8c943b1d5d90fa8c8147571837573338bb6;hpb=335a67d2ad481b03607bf30a38c28178fa1ad61a diff --git a/lib/random32.c b/lib/random32.c index 1e5b2df4429..61489677870 100644 --- a/lib/random32.c +++ b/lib/random32.c @@ -244,8 +244,19 @@ static void __prandom_reseed(bool late) static bool latch = false; static DEFINE_SPINLOCK(lock); + /* Asking for random bytes might result in bytes getting + * moved into the nonblocking pool and thus marking it + * as initialized. In this case we would double back into + * this function and attempt to do a late reseed. + * Ignore the pointless attempt to reseed again if we're + * already waiting for bytes when the nonblocking pool + * got initialized. + */ + /* only allow initial seeding (late == false) once */ - spin_lock_irqsave(&lock, flags); + if (!spin_trylock_irqsave(&lock, flags)) + return; + if (latch && !late) goto out; latch = true;