diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 13 | 
1 files changed, 7 insertions, 6 deletions
| diff --git a/kernel/fork.c b/kernel/fork.c index 8c700f881d92..48ed22774efa 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -2486,11 +2486,11 @@ long do_fork(unsigned long clone_flags,  	      int __user *child_tidptr)  {  	struct kernel_clone_args args = { -		.flags		= (clone_flags & ~CSIGNAL), +		.flags		= (lower_32_bits(clone_flags) & ~CSIGNAL),  		.pidfd		= parent_tidptr,  		.child_tid	= child_tidptr,  		.parent_tid	= parent_tidptr, -		.exit_signal	= (clone_flags & CSIGNAL), +		.exit_signal	= (lower_32_bits(clone_flags) & CSIGNAL),  		.stack		= stack_start,  		.stack_size	= stack_size,  	}; @@ -2508,8 +2508,9 @@ long do_fork(unsigned long clone_flags,  pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags)  {  	struct kernel_clone_args args = { -		.flags		= ((flags | CLONE_VM | CLONE_UNTRACED) & ~CSIGNAL), -		.exit_signal	= (flags & CSIGNAL), +		.flags		= ((lower_32_bits(flags) | CLONE_VM | +				    CLONE_UNTRACED) & ~CSIGNAL), +		.exit_signal	= (lower_32_bits(flags) & CSIGNAL),  		.stack		= (unsigned long)fn,  		.stack_size	= (unsigned long)arg,  	}; @@ -2570,11 +2571,11 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,  #endif  {  	struct kernel_clone_args args = { -		.flags		= (clone_flags & ~CSIGNAL), +		.flags		= (lower_32_bits(clone_flags) & ~CSIGNAL),  		.pidfd		= parent_tidptr,  		.child_tid	= child_tidptr,  		.parent_tid	= parent_tidptr, -		.exit_signal	= (clone_flags & CSIGNAL), +		.exit_signal	= (lower_32_bits(clone_flags) & CSIGNAL),  		.stack		= newsp,  		.tls		= tls,  	}; |