clean overflow checks in count_mounts() a bit

Wraparound checks in there are redundant (x + y < x and
x + y < y are equivalent when x and y are both unsigned int).

IMO more straightforward code would be better here...

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2022-02-13 22:42:30 -05:00
parent 90b2433edb
commit 124f75f864
1 changed files with 10 additions and 9 deletions

View File

@ -2069,22 +2069,23 @@ static int invent_group_ids(struct mount *mnt, bool recurse)
int count_mounts(struct mnt_namespace *ns, struct mount *mnt)
{
unsigned int max = READ_ONCE(sysctl_mount_max);
unsigned int mounts = 0, old, pending, sum;
unsigned int mounts = 0;
struct mount *p;
if (ns->mounts >= max)
return -ENOSPC;
max -= ns->mounts;
if (ns->pending_mounts >= max)
return -ENOSPC;
max -= ns->pending_mounts;
for (p = mnt; p; p = next_mnt(p, mnt))
mounts++;
old = ns->mounts;
pending = ns->pending_mounts;
sum = old + pending;
if ((old > sum) ||
(pending > sum) ||
(max < sum) ||
(mounts > (max - sum)))
if (mounts > max)
return -ENOSPC;
ns->pending_mounts = pending + mounts;
ns->pending_mounts += mounts;
return 0;
}