]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - kernel/fork.c
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux.git] / kernel / fork.c
index 8f3e2d97d77100dd746d98f7410c8601c3c8891b..d8ae0f1b4148023c8c0d242b799039deb362ca09 100644 (file)
@@ -677,7 +677,6 @@ void __mmdrop(struct mm_struct *mm)
        WARN_ON_ONCE(mm == current->active_mm);
        mm_free_pgd(mm);
        destroy_context(mm);
-       hmm_mm_destroy(mm);
        mmu_notifier_mm_destroy(mm);
        check_mm(mm);
        put_user_ns(mm->user_ns);
@@ -2406,6 +2405,16 @@ long _do_fork(struct kernel_clone_args *args)
        return nr;
 }
 
+bool legacy_clone_args_valid(const struct kernel_clone_args *kargs)
+{
+       /* clone(CLONE_PIDFD) uses parent_tidptr to return a pidfd */
+       if ((kargs->flags & CLONE_PIDFD) &&
+           (kargs->flags & CLONE_PARENT_SETTID))
+               return false;
+
+       return true;
+}
+
 #ifndef CONFIG_HAVE_COPY_THREAD_TLS
 /* For compatibility with architectures that call do_fork directly rather than
  * using the syscall entry points below. */
@@ -2417,6 +2426,7 @@ long do_fork(unsigned long clone_flags,
 {
        struct kernel_clone_args args = {
                .flags          = (clone_flags & ~CSIGNAL),
+               .pidfd          = parent_tidptr,
                .child_tid      = child_tidptr,
                .parent_tid     = parent_tidptr,
                .exit_signal    = (clone_flags & CSIGNAL),
@@ -2424,6 +2434,9 @@ long do_fork(unsigned long clone_flags,
                .stack_size     = stack_size,
        };
 
+       if (!legacy_clone_args_valid(&args))
+               return -EINVAL;
+
        return _do_fork(&args);
 }
 #endif
@@ -2505,8 +2518,7 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,
                .tls            = tls,
        };
 
-       /* clone(CLONE_PIDFD) uses parent_tidptr to return a pidfd */
-       if ((clone_flags & CLONE_PIDFD) && (clone_flags & CLONE_PARENT_SETTID))
+       if (!legacy_clone_args_valid(&args))
                return -EINVAL;
 
        return _do_fork(&args);