X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=kernel%2Ffork.c;h=af0ab7e8328bb9b63ddbfd9bc94b9d13228a1fe9;hb=30a05366b24ccec02197ebdc8683b6a3845063f7;hp=11c5c8ab827c4be8ef8cb09072de2364d90aff6c;hpb=4e06d4f083d6b485d689948479d5b2052917373d;p=mirror_ubuntu-zesty-kernel.git diff --git a/kernel/fork.c b/kernel/fork.c index 11c5c8ab827c..af0ab7e8328b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -88,6 +88,11 @@ #define CREATE_TRACE_POINTS #include +#ifdef CONFIG_USER_NS +extern int unprivileged_userns_clone; +#else +#define unprivileged_userns_clone 0 +#endif /* * Minimum number of threads to boot the kernel @@ -626,7 +631,7 @@ static __latent_entropy int dup_mmap(struct mm_struct *mm, struct inode *inode = file_inode(file); struct address_space *mapping = file->f_mapping; - get_file(file); + vma_get_file(tmp); if (tmp->vm_flags & VM_DENYWRITE) atomic_dec(&inode->i_writecount); i_mmap_lock_write(mapping); @@ -1471,6 +1476,10 @@ static __latent_entropy struct task_struct *copy_process( if ((clone_flags & (CLONE_NEWUSER|CLONE_FS)) == (CLONE_NEWUSER|CLONE_FS)) return ERR_PTR(-EINVAL); + if ((clone_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) + if (!capable(CAP_SYS_ADMIN)) + return ERR_PTR(-EPERM); + /* * Thread groups must share signals as well, and detached threads * can only be started up within the thread group. @@ -2209,6 +2218,12 @@ SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) if (unshare_flags & CLONE_NEWNS) unshare_flags |= CLONE_FS; + if ((unshare_flags & CLONE_NEWUSER) && !unprivileged_userns_clone) { + err = -EPERM; + if (!capable(CAP_SYS_ADMIN)) + goto bad_unshare_out; + } + err = check_unshare_flags(unshare_flags); if (err) goto bad_unshare_out;