diff options
author | Alex Shi <alex.shi@linaro.org> | 2016-08-18 12:33:31 +0800 |
---|---|---|
committer | Alex Shi <alex.shi@linaro.org> | 2016-08-18 12:33:31 +0800 |
commit | fdd85431d91c9da37e9e696eb8fe80f1a2dcdbeb (patch) | |
tree | ac60b28ebed345df274ce42aa3c9f3ee091875d1 /drivers/char | |
parent | e01035c1a71d7cceebc3df92f79577df7438523a (diff) | |
parent | e779279da78339ec75fa72571ef901a447762cc6 (diff) |
Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
Diffstat (limited to 'drivers/char')
-rw-r--r-- | drivers/char/random.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/drivers/char/random.c b/drivers/char/random.c index b583e5336630..e511f34be177 100644 --- a/drivers/char/random.c +++ b/drivers/char/random.c @@ -722,15 +722,18 @@ retry: } } -static void credit_entropy_bits_safe(struct entropy_store *r, int nbits) +static int credit_entropy_bits_safe(struct entropy_store *r, int nbits) { const int nbits_max = (int)(~0U >> (ENTROPY_SHIFT + 1)); + if (nbits < 0) + return -EINVAL; + /* Cap the value to avoid overflows */ nbits = min(nbits, nbits_max); - nbits = max(nbits, -nbits_max); credit_entropy_bits(r, nbits); + return 0; } /********************************************************************* @@ -1542,8 +1545,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg) return -EPERM; if (get_user(ent_count, p)) return -EFAULT; - credit_entropy_bits_safe(&input_pool, ent_count); - return 0; + return credit_entropy_bits_safe(&input_pool, ent_count); case RNDADDENTROPY: if (!capable(CAP_SYS_ADMIN)) return -EPERM; @@ -1557,8 +1559,7 @@ static long random_ioctl(struct file *f, unsigned int cmd, unsigned long arg) size); if (retval < 0) return retval; - credit_entropy_bits_safe(&input_pool, ent_count); - return 0; + return credit_entropy_bits_safe(&input_pool, ent_count); case RNDZAPENTCNT: case RNDCLEARPOOL: /* |