X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=lib%2Frandom32.c;h=61489677870007e273301209438ac4913562b140;hb=HEAD;hp=1e5b2df442916de82ef497f844c068724f8cd555;hpb=b8aba7611b9a5a1f67f081be84270c67baf4d2c3;p=~andy%2Flinux 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;