Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
[firefly-linux-kernel-4.4.55.git] / drivers / char / random.c
index b583e53366306db870a0d61918156f41985f075e..e511f34be17749f5fb658d2ce35d81305617eb93 100644 (file)
@@ -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:
                /*