|
@@ -738,15 +738,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;
|
|
|
}
|
|
|
|
|
|
/*********************************************************************
|
|
@@ -1823,8 +1826,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;
|
|
@@ -1838,8 +1840,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:
|
|
|
/*
|