diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 45 | 
1 files changed, 18 insertions, 27 deletions
| diff --git a/kernel/fork.c b/kernel/fork.c index f9572f416126..1f6c45f6a734 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2525,39 +2525,19 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,  #ifdef __ARCH_WANT_SYS_CLONE3  noinline static int copy_clone_args_from_user(struct kernel_clone_args *kargs,  					      struct clone_args __user *uargs, -					      size_t size) +					      size_t usize)  { +	int err;  	struct clone_args args; -	if (unlikely(size > PAGE_SIZE)) +	if (unlikely(usize > PAGE_SIZE))  		return -E2BIG; - -	if (unlikely(size < sizeof(struct clone_args))) +	if (unlikely(usize < CLONE_ARGS_SIZE_VER0))  		return -EINVAL; -	if (unlikely(!access_ok(uargs, size))) -		return -EFAULT; - -	if (size > sizeof(struct clone_args)) { -		unsigned char __user *addr; -		unsigned char __user *end; -		unsigned char val; - -		addr = (void __user *)uargs + sizeof(struct clone_args); -		end = (void __user *)uargs + size; - -		for (; addr < end; addr++) { -			if (get_user(val, addr)) -				return -EFAULT; -			if (val) -				return -E2BIG; -		} - -		size = sizeof(struct clone_args); -	} - -	if (copy_from_user(&args, uargs, size)) -		return -EFAULT; +	err = copy_struct_from_user(&args, sizeof(args), uargs, usize); +	if (err) +		return err;  	/*  	 * Verify that higher 32bits of exit_signal are unset and that @@ -2604,6 +2584,17 @@ static bool clone3_args_valid(const struct kernel_clone_args *kargs)  	return true;  } +/** + * clone3 - create a new process with specific properties + * @uargs: argument structure + * @size:  size of @uargs + * + * clone3() is the extensible successor to clone()/clone2(). + * It takes a struct as argument that is versioned by its size. + * + * Return: On success, a positive PID for the child process. + *         On error, a negative errno number. + */  SYSCALL_DEFINE2(clone3, struct clone_args __user *, uargs, size_t, size)  {  	int err; | 
