diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 37 | 
1 files changed, 11 insertions, 26 deletions
| diff --git a/kernel/fork.c b/kernel/fork.c index 99076dbe27d8..942e3d8617bf 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -115,6 +115,8 @@  #define CREATE_TRACE_POINTS  #include <trace/events/task.h> +#include <kunit/visibility.h> +  /*   * Minimum number of threads to boot the kernel   */ @@ -616,12 +618,6 @@ static void dup_mm_exe_file(struct mm_struct *mm, struct mm_struct *oldmm)  	exe_file = get_mm_exe_file(oldmm);  	RCU_INIT_POINTER(mm->exe_file, exe_file); -	/* -	 * We depend on the oldmm having properly denied write access to the -	 * exe_file already. -	 */ -	if (exe_file && deny_write_access(exe_file)) -		pr_warn_once("deny_write_access() failed in %s\n", __func__);  }  #ifdef CONFIG_MMU @@ -1334,6 +1330,7 @@ struct mm_struct *mm_alloc(void)  	memset(mm, 0, sizeof(*mm));  	return mm_init(mm, current, current_user_ns());  } +EXPORT_SYMBOL_IF_KUNIT(mm_alloc);  static inline void __mmput(struct mm_struct *mm)  { @@ -1412,20 +1409,11 @@ int set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file)  	 */  	old_exe_file = rcu_dereference_raw(mm->exe_file); -	if (new_exe_file) { -		/* -		 * We expect the caller (i.e., sys_execve) to already denied -		 * write access, so this is unlikely to fail. -		 */ -		if (unlikely(deny_write_access(new_exe_file))) -			return -EACCES; +	if (new_exe_file)  		get_file(new_exe_file); -	}  	rcu_assign_pointer(mm->exe_file, new_exe_file); -	if (old_exe_file) { -		allow_write_access(old_exe_file); +	if (old_exe_file)  		fput(old_exe_file); -	}  	return 0;  } @@ -1464,9 +1452,6 @@ int replace_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file)  			return ret;  	} -	ret = deny_write_access(new_exe_file); -	if (ret) -		return -EACCES;  	get_file(new_exe_file);  	/* set the new file */ @@ -1475,10 +1460,8 @@ int replace_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file)  	rcu_assign_pointer(mm->exe_file, new_exe_file);  	mmap_write_unlock(mm); -	if (old_exe_file) { -		allow_write_access(old_exe_file); +	if (old_exe_file)  		fput(old_exe_file); -	}  	return 0;  } @@ -2941,8 +2924,6 @@ SYSCALL_DEFINE5(clone, unsigned long, clone_flags, unsigned long, newsp,  }  #endif -#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 usize) @@ -3086,6 +3067,11 @@ SYSCALL_DEFINE2(clone3, struct clone_args __user *, uargs, size_t, size)  	struct kernel_clone_args kargs;  	pid_t set_tid[MAX_PID_NS_LEVEL]; +#ifdef __ARCH_BROKEN_SYS_CLONE3 +#warning clone3() entry point is missing, please fix +	return -ENOSYS; +#endif +  	kargs.set_tid = set_tid;  	err = copy_clone_args_from_user(&kargs, uargs, size); @@ -3097,7 +3083,6 @@ SYSCALL_DEFINE2(clone3, struct clone_args __user *, uargs, size_t, size)  	return kernel_clone(&kargs);  } -#endif  void walk_process_tree(struct task_struct *top, proc_visitor visitor, void *data)  { | 
