#ifndef __ASSEMBLY__
  /**
   * struct clone_args - arguments for the clone3 syscall
-  * @flags:       Flags for the new process as listed above.
-  *               All flags are valid except for CSIGNAL and
-  *               CLONE_DETACHED.
-  * @pidfd:       If CLONE_PIDFD is set, a pidfd will be
-  *               returned in this argument.
-  * @child_tid:   If CLONE_CHILD_SETTID is set, the TID of the
-  *               child process will be returned in the child's
-  *               memory.
-  * @parent_tid:  If CLONE_PARENT_SETTID is set, the TID of
-  *               the child process will be returned in the
-  *               parent's memory.
-  * @exit_signal: The exit_signal the parent process will be
-  *               sent when the child exits.
-  * @stack:       Specify the location of the stack for the
-  *               child process.
-  *               Note, @stack is expected to point to the
-  *               lowest address. The stack direction will be
-  *               determined by the kernel and set up
-  *               appropriately based on @stack_size.
-  * @stack_size:  The size of the stack for the child process.
-  * @tls:         If CLONE_SETTLS is set, the tls descriptor
-  *               is set to tls.
+  * @flags:        Flags for the new process as listed above.
+  *                All flags are valid except for CSIGNAL and
+  *                CLONE_DETACHED.
+  * @pidfd:        If CLONE_PIDFD is set, a pidfd will be
+  *                returned in this argument.
+  * @child_tid:    If CLONE_CHILD_SETTID is set, the TID of the
+  *                child process will be returned in the child's
+  *                memory.
+  * @parent_tid:   If CLONE_PARENT_SETTID is set, the TID of
+  *                the child process will be returned in the
+  *                parent's memory.
+  * @exit_signal:  The exit_signal the parent process will be
+  *                sent when the child exits.
+  * @stack:        Specify the location of the stack for the
+  *                child process.
++ *                Note, @stack is expected to point to the
++ *                lowest address. The stack direction will be
++ *                determined by the kernel and set up
++ *                appropriately based on @stack_size.
+  * @stack_size:   The size of the stack for the child process.
+  * @tls:          If CLONE_SETTLS is set, the tls descriptor
+  *                is set to tls.
+  * @set_tid:      Pointer to an array of type *pid_t. The size
+  *                of the array is defined using @set_tid_size.
+  *                This array is used to select PIDs/TIDs for
+  *                newly created processes. The first element in
+  *                this defines the PID in the most nested PID
+  *                namespace. Each additional element in the array
+  *                defines the PID in the parent PID namespace of
+  *                the original PID namespace. If the array has
+  *                less entries than the number of currently
+  *                nested PID namespaces only the PIDs in the
+  *                corresponding namespaces are set.
+  * @set_tid_size: This defines the size of the array referenced
+  *                in @set_tid. This cannot be larger than the
+  *                kernel's limit of nested PID namespaces.
   *
   * The structure is versioned by size and thus extensible.
   * New struct members must go at the end of the struct and
 
        return 0;
  }
  
 -static bool clone3_args_valid(const struct kernel_clone_args *kargs)
 +/**
 + * clone3_stack_valid - check and prepare stack
 + * @kargs: kernel clone args
 + *
 + * Verify that the stack arguments userspace gave us are sane.
 + * In addition, set the stack direction for userspace since it's easy for us to
 + * determine.
 + */
 +static inline bool clone3_stack_valid(struct kernel_clone_args *kargs)
 +{
 +      if (kargs->stack == 0) {
 +              if (kargs->stack_size > 0)
 +                      return false;
 +      } else {
 +              if (kargs->stack_size == 0)
 +                      return false;
 +
 +              if (!access_ok((void __user *)kargs->stack, kargs->stack_size))
 +                      return false;
 +
 +#if !defined(CONFIG_STACK_GROWSUP) && !defined(CONFIG_IA64)
 +              kargs->stack += kargs->stack_size;
 +#endif
 +      }
 +
 +      return true;
 +}
 +
 +static bool clone3_args_valid(struct kernel_clone_args *kargs)
  {
-       /*
-        * All lower bits of the flag word are taken.
-        * Verify that no other unknown flags are passed along.
-        */
-       if (kargs->flags & ~CLONE_LEGACY_FLAGS)
+       /* Verify that no unknown flags are passed along. */
+       if (kargs->flags & ~(CLONE_LEGACY_FLAGS | CLONE_CLEAR_SIGHAND))
                return false;
  
        /*