OSDN Git Service

Merge tag 'ucount-rlimit-for-v5.18' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Mar 2022 00:10:07 +0000 (17:10 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 29 Mar 2022 00:10:07 +0000 (17:10 -0700)
Pull shm ucounts fix from Eric Biederman:
 "The introduction of a new failure mode when the code was converted to
  ucounts resulted in user_shm_lock misbehaving.

  The change simplifies the code to make the code easier to follow and
  removes the known misbehaviors"

* tag 'ucount-rlimit-for-v5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace:
  mm/mlock: fix two bugs in user_shm_lock()

mm/mlock.c

index efd2dd2..529fbc1 100644 (file)
@@ -721,13 +721,12 @@ int user_shm_lock(size_t size, struct ucounts *ucounts)
 
        locked = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
        lock_limit = rlimit(RLIMIT_MEMLOCK);
-       if (lock_limit == RLIM_INFINITY)
-               allowed = 1;
-       lock_limit >>= PAGE_SHIFT;
+       if (lock_limit != RLIM_INFINITY)
+               lock_limit >>= PAGE_SHIFT;
        spin_lock(&shmlock_user_lock);
        memlock = inc_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_MEMLOCK, locked);
 
-       if (!allowed && (memlock == LONG_MAX || memlock > lock_limit) && !capable(CAP_IPC_LOCK)) {
+       if ((memlock == LONG_MAX || memlock > lock_limit) && !capable(CAP_IPC_LOCK)) {
                dec_rlimit_ucounts(ucounts, UCOUNT_RLIMIT_MEMLOCK, locked);
                goto out;
        }