clean overflow checks in count_mounts() a bit
authorAl Viro <viro@zeniv.linux.org.uk>
Mon, 14 Feb 2022 03:42:30 +0000 (22:42 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Mon, 14 Feb 2022 03:42:30 +0000 (22:42 -0500)
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>
fs/namespace.c

index 13d025a..42d4fc2 100644 (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;
 }