]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm...
authorLinus Torvalds <torvalds@linux-foundation.org>
Fri, 10 Apr 2020 19:59:56 +0000 (12:59 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Fri, 10 Apr 2020 19:59:56 +0000 (12:59 -0700)
Pull proc fix from Eric Biederman:
 "A brown paper bag slipped through my proc changes, and syzcaller
  caught it when the code ended up in your tree.

  I have opted to fix it the simplest cleanest way I know how, so there
  is no reasonable chance for the bug to repeat"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace:
  proc: Use a dedicated lock in struct pid

1  2 
kernel/pid.c

diff --cc kernel/pid.c
index bc21c0fb26d8b09e564aead32d8bb8b3d8a938d9,517d0855d4cf29d5eabd59d45683e1c2bedb17b5..c835b844aca7c5fdaa311c879ce5e35e540f1f31
@@@ -244,18 -244,9 +244,19 @@@ struct pid *alloc_pid(struct pid_namesp
                tmp = tmp->parent;
        }
  
 +      /*
 +       * ENOMEM is not the most obvious choice especially for the case
 +       * where the child subreaper has already exited and the pid
 +       * namespace denies the creation of any new processes. But ENOMEM
 +       * is what we have exposed to userspace for a long time and it is
 +       * documented behavior for pid namespaces. So we can't easily
 +       * change it even if there were an error code better suited.
 +       */
 +      retval = -ENOMEM;
 +
        get_pid_ns(ns);
        refcount_set(&pid->count, 1);
+       spin_lock_init(&pid->lock);
        for (type = 0; type < PIDTYPE_MAX; ++type)
                INIT_HLIST_HEAD(&pid->tasks[type]);