lkml.org 
[lkml]   [2022]   [Oct]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 037/159] random: restore O_NONBLOCK support
    Date
    From: Jason A. Donenfeld <Jason@zx2c4.com>

    commit cd4f24ae9404fd31fc461066e57889be3b68641b upstream.

    Prior to 5.6, when /dev/random was opened with O_NONBLOCK, it would
    return -EAGAIN if there was no entropy. When the pools were unified in
    5.6, this was lost. The post 5.6 behavior of blocking until the pool is
    initialized, and ignoring O_NONBLOCK in the process, went unnoticed,
    with no reports about the regression received for two and a half years.
    However, eventually this indeed did break somebody's userspace.

    So we restore the old behavior, by returning -EAGAIN if the pool is not
    initialized. Unlike the old /dev/random, this can only occur during
    early boot, after which it never blocks again.

    In order to make this O_NONBLOCK behavior consistent with other
    expectations, also respect users reading with preadv2(RWF_NOWAIT) and
    similar.

    Fixes: 30c08efec888 ("random: make /dev/random be almost like /dev/urandom")
    Reported-by: Guozihua <guozihua@huawei.com>
    Reported-by: Zhongguohua <zhongguohua1@huawei.com>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Theodore Ts'o <tytso@mit.edu>
    Cc: Andrew Lutomirski <luto@kernel.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/char/random.c | 4 ++++
    1 file changed, 4 insertions(+)

    --- a/drivers/char/random.c
    +++ b/drivers/char/random.c
    @@ -1295,6 +1295,10 @@ static ssize_t random_read_iter(struct k
    {
    int ret;

    + if (!crng_ready() &&
    + (kiocb->ki_filp->f_flags & O_NONBLOCK))
    + return -EAGAIN;
    +
    ret = wait_for_random_bytes();
    if (ret != 0)
    return ret;

    \
     
     \ /
      Last update: 2022-10-24 13:46    [W:4.185 / U:0.324 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site