It's valid for HWRNG drivers to return 0 bytes read, thereby instructing the caller to try again. We do that for the cdev_read operation, but in case the driver never returns a non-zero value, barebox will keep waiting indefinitely. Check ctrlc() in that case and return a short read if the user interrupts the operation. We don't need ctrlc() in the general case, as the caller is free to check for ctrlc() between reads to the device. Signed-off-by: Ahmad Fatoum <a.fatoum@xxxxxxxxxxxxxx> --- drivers/hw_random/core.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/hw_random/core.c b/drivers/hw_random/core.c index 89b979ade8b1..7bc3c33319f9 100644 --- a/drivers/hw_random/core.c +++ b/drivers/hw_random/core.c @@ -44,10 +44,10 @@ static ssize_t rng_dev_read(struct cdev *cdev, void *buf, size_t size, while (count) { int max = min(count, (size_t)RNG_BUFFER_SIZE); len = hwrng_get_data(rng, rng->buf, max, true); - if (len < 0) { - cur = len; - break; - } + if (len < 0) + return len; + if (!len && ctrlc()) + return cur; memcpy(buf + cur, rng->buf, len); -- 2.39.2