Blame view

kernel/utsname.c 2.87 KB
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
1
2
3
4
5
6
7
8
9
10
  /*
   *  Copyright (C) 2004 IBM Corporation
   *
   *  Author: Serge Hallyn <serue@us.ibm.com>
   *
   *  This program is free software; you can redistribute it and/or
   *  modify it under the terms of the GNU General Public License as
   *  published by the Free Software Foundation, version 2 of the
   *  License.
   */
9984de1a5   Paul Gortmaker   kernel: Map most ...
11
  #include <linux/export.h>
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
12
13
  #include <linux/uts.h>
  #include <linux/utsname.h>
467e9f4b5   Cedric Le Goater   fix create_new_na...
14
  #include <linux/err.h>
1aeb272cf   Robert P. J. Day   kernel: explicitl...
15
  #include <linux/slab.h>
59607db36   Serge E. Hallyn   userns: add a use...
16
  #include <linux/user_namespace.h>
0bb80f240   David Howells   proc: Split the n...
17
  #include <linux/proc_ns.h>
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
18

4c2a7e72d   Alexey Dobriyan   utsns: extract cr...
19
20
21
22
23
24
25
26
27
  static struct uts_namespace *create_uts_ns(void)
  {
  	struct uts_namespace *uts_ns;
  
  	uts_ns = kmalloc(sizeof(struct uts_namespace), GFP_KERNEL);
  	if (uts_ns)
  		kref_init(&uts_ns->kref);
  	return uts_ns;
  }
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
28
  /*
071df104f   Serge E. Hallyn   [PATCH] namespace...
29
30
   * Clone a new ns copying an original utsname, setting refcount to 1
   * @old_ns: namespace to clone
bf5315366   Yuanhan Liu   kernel/utsname.c:...
31
   * Return ERR_PTR(-ENOMEM) on error (failure to kmalloc), new ns otherwise
071df104f   Serge E. Hallyn   [PATCH] namespace...
32
   */
bcf58e725   Eric W. Biederman   userns: Make crea...
33
  static struct uts_namespace *clone_uts_ns(struct user_namespace *user_ns,
bb96a6f50   Serge E. Hallyn   userns: allow set...
34
  					  struct uts_namespace *old_ns)
071df104f   Serge E. Hallyn   [PATCH] namespace...
35
36
  {
  	struct uts_namespace *ns;
98f842e67   Eric W. Biederman   proc: Usable inod...
37
  	int err;
071df104f   Serge E. Hallyn   [PATCH] namespace...
38

4c2a7e72d   Alexey Dobriyan   utsns: extract cr...
39
  	ns = create_uts_ns();
467e9f4b5   Cedric Le Goater   fix create_new_na...
40
41
  	if (!ns)
  		return ERR_PTR(-ENOMEM);
98f842e67   Eric W. Biederman   proc: Usable inod...
42
43
44
45
46
  	err = proc_alloc_inum(&ns->proc_inum);
  	if (err) {
  		kfree(ns);
  		return ERR_PTR(err);
  	}
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
47
  	down_read(&uts_sem);
467e9f4b5   Cedric Le Goater   fix create_new_na...
48
  	memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
bcf58e725   Eric W. Biederman   userns: Make crea...
49
  	ns->user_ns = get_user_ns(user_ns);
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
50
  	up_read(&uts_sem);
071df104f   Serge E. Hallyn   [PATCH] namespace...
51
52
53
54
  	return ns;
  }
  
  /*
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
55
56
57
58
59
   * Copy task tsk's utsname namespace, or clone it if flags
   * specifies CLONE_NEWUTS.  In latter case, changes to the
   * utsname of this process won't be seen by parent, and vice
   * versa.
   */
bb96a6f50   Serge E. Hallyn   userns: allow set...
60
  struct uts_namespace *copy_utsname(unsigned long flags,
bcf58e725   Eric W. Biederman   userns: Make crea...
61
  	struct user_namespace *user_ns, struct uts_namespace *old_ns)
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
62
  {
071df104f   Serge E. Hallyn   [PATCH] namespace...
63
  	struct uts_namespace *new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
64

e3222c4ec   Badari Pulavarty   Merge sys_clone()...
65
  	BUG_ON(!old_ns);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
66
  	get_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
67
  	if (!(flags & CLONE_NEWUTS))
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
68
  		return old_ns;
071df104f   Serge E. Hallyn   [PATCH] namespace...
69

bcf58e725   Eric W. Biederman   userns: Make crea...
70
  	new_ns = clone_uts_ns(user_ns, old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
71

071df104f   Serge E. Hallyn   [PATCH] namespace...
72
  	put_uts_ns(old_ns);
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
73
  	return new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
74
75
76
77
78
79
80
  }
  
  void free_uts_ns(struct kref *kref)
  {
  	struct uts_namespace *ns;
  
  	ns = container_of(kref, struct uts_namespace, kref);
59607db36   Serge E. Hallyn   userns: add a use...
81
  	put_user_ns(ns->user_ns);
98f842e67   Eric W. Biederman   proc: Usable inod...
82
  	proc_free_inum(ns->proc_inum);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
83
84
  	kfree(ns);
  }
34482e89a   Eric W. Biederman   ns proc: Add supp...
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  
  static void *utsns_get(struct task_struct *task)
  {
  	struct uts_namespace *ns = NULL;
  	struct nsproxy *nsproxy;
  
  	rcu_read_lock();
  	nsproxy = task_nsproxy(task);
  	if (nsproxy) {
  		ns = nsproxy->uts_ns;
  		get_uts_ns(ns);
  	}
  	rcu_read_unlock();
  
  	return ns;
  }
  
  static void utsns_put(void *ns)
  {
  	put_uts_ns(ns);
  }
142e1d1d5   Eric W. Biederman   userns: Allow unp...
106
  static int utsns_install(struct nsproxy *nsproxy, void *new)
34482e89a   Eric W. Biederman   ns proc: Add supp...
107
  {
142e1d1d5   Eric W. Biederman   userns: Allow unp...
108
  	struct uts_namespace *ns = new;
5e4a08476   Eric W. Biederman   userns: Require C...
109
  	if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) ||
c7b96acf1   Eric W. Biederman   userns: Kill nso...
110
  	    !ns_capable(current_user_ns(), CAP_SYS_ADMIN))
142e1d1d5   Eric W. Biederman   userns: Allow unp...
111
  		return -EPERM;
34482e89a   Eric W. Biederman   ns proc: Add supp...
112
113
114
115
116
  	get_uts_ns(ns);
  	put_uts_ns(nsproxy->uts_ns);
  	nsproxy->uts_ns = ns;
  	return 0;
  }
98f842e67   Eric W. Biederman   proc: Usable inod...
117
118
119
120
121
122
  static unsigned int utsns_inum(void *vp)
  {
  	struct uts_namespace *ns = vp;
  
  	return ns->proc_inum;
  }
34482e89a   Eric W. Biederman   ns proc: Add supp...
123
124
125
126
127
128
  const struct proc_ns_operations utsns_operations = {
  	.name		= "uts",
  	.type		= CLONE_NEWUTS,
  	.get		= utsns_get,
  	.put		= utsns_put,
  	.install	= utsns_install,
98f842e67   Eric W. Biederman   proc: Usable inod...
129
  	.inum		= utsns_inum,
34482e89a   Eric W. Biederman   ns proc: Add supp...
130
  };