Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8d2d128 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'random_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random

Pull /dev/random fix from Ted Ts'o:
 "Fix a BUG splat found by trinity"

* tag 'random_for_linus_stable' of git://git.kernel.org/pub/scm/linux/kernel/git/tytso/random:
  random: check for increase of entropy_count because of signed conversion
parents 4e106275 79a84687
Loading
Loading
Loading
Loading
+14 −3
Original line number Diff line number Diff line
@@ -641,7 +641,7 @@ retry:
		} while (unlikely(entropy_count < pool_size-2 && pnfrac));
	}

	if (entropy_count < 0) {
	if (unlikely(entropy_count < 0)) {
		pr_warn("random: negative entropy/overflow: pool %s count %d\n",
			r->name, entropy_count);
		WARN_ON(1);
@@ -981,7 +981,7 @@ static size_t account(struct entropy_store *r, size_t nbytes, int min,
		      int reserved)
{
	int entropy_count, orig;
	size_t ibytes;
	size_t ibytes, nfrac;

	BUG_ON(r->entropy_count > r->poolinfo->poolfracbits);

@@ -999,7 +999,17 @@ retry:
	}
	if (ibytes < min)
		ibytes = 0;
	if ((entropy_count -= ibytes << (ENTROPY_SHIFT + 3)) < 0)

	if (unlikely(entropy_count < 0)) {
		pr_warn("random: negative entropy count: pool %s count %d\n",
			r->name, entropy_count);
		WARN_ON(1);
		entropy_count = 0;
	}
	nfrac = ibytes << (ENTROPY_SHIFT + 3);
	if ((size_t) entropy_count > nfrac)
		entropy_count -= nfrac;
	else
		entropy_count = 0;

	if (cmpxchg(&r->entropy_count, orig, entropy_count) != orig)
@@ -1376,6 +1386,7 @@ urandom_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
			    "with %d bits of entropy available\n",
			    current->comm, nonblocking_pool.entropy_total);

	nbytes = min_t(size_t, nbytes, INT_MAX >> (ENTROPY_SHIFT + 3));
	ret = extract_entropy_user(&nonblocking_pool, buf, nbytes);

	trace_urandom_read(8 * nbytes, ENTROPY_BITS(&nonblocking_pool),