drivers/char/random.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/drivers/char/random.c b/drivers/char/random.c index e15063d61460..32c3d1dde16f 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -547,33 +547,30 @@ static ssize_t get_random_bytes_user(void __user *buf, size_t nbytes) goto out_zero_chacha; } - do { + for (;;) { chacha20_block(chacha_state, output); if (unlikely(chacha_state[12] == 0)) ++chacha_state[13]; len = min_t(size_t, nbytes, CHACHA_BLOCK_SIZE); - if (copy_to_user(buf, output, len)) { - ret = -EFAULT; + if (copy_to_user(buf, output, len)) break; - } - nbytes -= len; buf += len; ret += len; + nbytes -= len; + if (!nbytes) + break; - BUILD_BUG_ON(PAGE_SIZE % CHACHA_BLOCK_SIZE != 0); - if (!(ret % PAGE_SIZE) && nbytes) { - if (signal_pending(current)) - break; - cond_resched(); - } - } while (nbytes); + if (signal_pending(current)) + break; + cond_resched(); + } memzero_explicit(output, sizeof(output)); out_zero_chacha: memzero_explicit(chacha_state, sizeof(chacha_state)); - return ret; + return ret ? ret : -EFAULT; } /*