Blame view

kernel/utsname.c 2.5 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>
34482e89a   Eric W. Biederman   ns proc: Add supp...
17
  #include <linux/proc_fs.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
31
32
   * Clone a new ns copying an original utsname, setting refcount to 1
   * @old_ns: namespace to clone
   * Return NULL on error (failure to kmalloc), new ns otherwise
   */
bb96a6f50   Serge E. Hallyn   userns: allow set...
33
34
  static struct uts_namespace *clone_uts_ns(struct task_struct *tsk,
  					  struct uts_namespace *old_ns)
071df104f   Serge E. Hallyn   [PATCH] namespace...
35
36
  {
  	struct uts_namespace *ns;
4c2a7e72d   Alexey Dobriyan   utsns: extract cr...
37
  	ns = create_uts_ns();
467e9f4b5   Cedric Le Goater   fix create_new_na...
38
39
  	if (!ns)
  		return ERR_PTR(-ENOMEM);
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
40
  	down_read(&uts_sem);
467e9f4b5   Cedric Le Goater   fix create_new_na...
41
  	memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
bb96a6f50   Serge E. Hallyn   userns: allow set...
42
  	ns->user_ns = get_user_ns(task_cred_xxx(tsk, user)->user_ns);
efc63c4fb   Alexey Dobriyan   Fix UTS corruptio...
43
  	up_read(&uts_sem);
071df104f   Serge E. Hallyn   [PATCH] namespace...
44
45
46
47
  	return ns;
  }
  
  /*
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
48
49
50
51
52
   * 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...
53
54
  struct uts_namespace *copy_utsname(unsigned long flags,
  				   struct task_struct *tsk)
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
55
  {
bb96a6f50   Serge E. Hallyn   userns: allow set...
56
  	struct uts_namespace *old_ns = tsk->nsproxy->uts_ns;
071df104f   Serge E. Hallyn   [PATCH] namespace...
57
  	struct uts_namespace *new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
58

e3222c4ec   Badari Pulavarty   Merge sys_clone()...
59
  	BUG_ON(!old_ns);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
60
  	get_uts_ns(old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
61
  	if (!(flags & CLONE_NEWUTS))
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
62
  		return old_ns;
071df104f   Serge E. Hallyn   [PATCH] namespace...
63

bb96a6f50   Serge E. Hallyn   userns: allow set...
64
  	new_ns = clone_uts_ns(tsk, old_ns);
071df104f   Serge E. Hallyn   [PATCH] namespace...
65

071df104f   Serge E. Hallyn   [PATCH] namespace...
66
  	put_uts_ns(old_ns);
e3222c4ec   Badari Pulavarty   Merge sys_clone()...
67
  	return new_ns;
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
68
69
70
71
72
73
74
  }
  
  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...
75
  	put_user_ns(ns->user_ns);
4865ecf13   Serge E. Hallyn   [PATCH] namespace...
76
77
  	kfree(ns);
  }
34482e89a   Eric W. Biederman   ns proc: Add supp...
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  
  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);
  }
  
  static int utsns_install(struct nsproxy *nsproxy, void *ns)
  {
  	get_uts_ns(ns);
  	put_uts_ns(nsproxy->uts_ns);
  	nsproxy->uts_ns = ns;
  	return 0;
  }
  
  const struct proc_ns_operations utsns_operations = {
  	.name		= "uts",
  	.type		= CLONE_NEWUTS,
  	.get		= utsns_get,
  	.put		= utsns_put,
  	.install	= utsns_install,
  };