diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/nsproxy.c | 7 | ||||
| -rw-r--r-- | kernel/sys.c | 2 | ||||
| -rw-r--r-- | kernel/utsname.c | 12 | 
3 files changed, 9 insertions, 12 deletions
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c index 034dc2ed13a..b97fc9d04dd 100644 --- a/kernel/nsproxy.c +++ b/kernel/nsproxy.c @@ -69,16 +69,11 @@ static struct nsproxy *create_new_namespaces(unsigned long flags,  		goto out_ns;  	} -	new_nsp->uts_ns = copy_utsname(flags, tsk->nsproxy->uts_ns); +	new_nsp->uts_ns = copy_utsname(flags, tsk);  	if (IS_ERR(new_nsp->uts_ns)) {  		err = PTR_ERR(new_nsp->uts_ns);  		goto out_uts;  	} -	if (new_nsp->uts_ns != tsk->nsproxy->uts_ns) { -		put_user_ns(new_nsp->uts_ns->user_ns); -		new_nsp->uts_ns->user_ns = task_cred_xxx(tsk, user)->user_ns; -		get_user_ns(new_nsp->uts_ns->user_ns); -	}  	new_nsp->ipc_ns = copy_ipcs(flags, tsk->nsproxy->ipc_ns);  	if (IS_ERR(new_nsp->ipc_ns)) { diff --git a/kernel/sys.c b/kernel/sys.c index 1ad48b3b906..5761c53e19e 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -1181,7 +1181,7 @@ SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)  	int errno;  	char tmp[__NEW_UTS_LEN]; -	if (!capable(CAP_SYS_ADMIN)) +	if (!ns_capable(current->nsproxy->uts_ns->user_ns, CAP_SYS_ADMIN))  		return -EPERM;  	if (len < 0 || len > __NEW_UTS_LEN)  		return -EINVAL; diff --git a/kernel/utsname.c b/kernel/utsname.c index a7b3a8d1ad2..44646179eab 100644 --- a/kernel/utsname.c +++ b/kernel/utsname.c @@ -31,7 +31,8 @@ static struct uts_namespace *create_uts_ns(void)   * @old_ns: namespace to clone   * Return NULL on error (failure to kmalloc), new ns otherwise   */ -static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns) +static struct uts_namespace *clone_uts_ns(struct task_struct *tsk, +					  struct uts_namespace *old_ns)  {  	struct uts_namespace *ns; @@ -41,8 +42,7 @@ static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns)  	down_read(&uts_sem);  	memcpy(&ns->name, &old_ns->name, sizeof(ns->name)); -	ns->user_ns = old_ns->user_ns; -	get_user_ns(ns->user_ns); +	ns->user_ns = get_user_ns(task_cred_xxx(tsk, user)->user_ns);  	up_read(&uts_sem);  	return ns;  } @@ -53,8 +53,10 @@ static struct uts_namespace *clone_uts_ns(struct uts_namespace *old_ns)   * utsname of this process won't be seen by parent, and vice   * versa.   */ -struct uts_namespace *copy_utsname(unsigned long flags, struct uts_namespace *old_ns) +struct uts_namespace *copy_utsname(unsigned long flags, +				   struct task_struct *tsk)  { +	struct uts_namespace *old_ns = tsk->nsproxy->uts_ns;  	struct uts_namespace *new_ns;  	BUG_ON(!old_ns); @@ -63,7 +65,7 @@ struct uts_namespace *copy_utsname(unsigned long flags, struct uts_namespace *ol  	if (!(flags & CLONE_NEWUTS))  		return old_ns; -	new_ns = clone_uts_ns(old_ns); +	new_ns = clone_uts_ns(tsk, old_ns);  	put_uts_ns(old_ns);  	return new_ns;  |