random: only wake up writers after zap if threshold was passed
authorJason A. Donenfeld <Jason@zx2c4.com>
Tue, 22 Feb 2022 13:01:57 +0000 (14:01 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Thu, 24 Feb 2022 15:32:35 +0000 (16:32 +0100)
The only time that we need to wake up /dev/random writers on
RNDCLEARPOOL/RNDZAPPOOL is when we're changing from a value that is
greater than or equal to POOL_MIN_BITS to zero, because if we're
changing from below POOL_MIN_BITS to zero, the writers are already
unblocked.

Cc: Theodore Ts'o <tytso@mit.edu>
Reviewed-by: Dominik Brodowski <linux@dominikbrodowski.net>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
drivers/char/random.c

index a4dedeea35e9760543c600b81284b7aa444731ec..536237a0f073b2fcc1e208f6f2b05a2a3d2f1112 100644 (file)
@@ -1582,7 +1582,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg)
                 */
                if (!capable(CAP_SYS_ADMIN))
                        return -EPERM;
-               if (xchg(&input_pool.entropy_count, 0)) {
+               if (xchg(&input_pool.entropy_count, 0) >= POOL_MIN_BITS) {
                        wake_up_interruptible(&random_write_wait);
                        kill_fasync(&fasync, SIGIO, POLL_OUT);
                }