|
@@ -58,6 +58,7 @@ int create_user_ns(struct cred *new)
|
|
struct user_namespace *ns, *parent_ns = new->user_ns;
|
|
struct user_namespace *ns, *parent_ns = new->user_ns;
|
|
kuid_t owner = new->euid;
|
|
kuid_t owner = new->euid;
|
|
kgid_t group = new->egid;
|
|
kgid_t group = new->egid;
|
|
|
|
+ int ret;
|
|
|
|
|
|
/* The creator needs a mapping in the parent user namespace
|
|
/* The creator needs a mapping in the parent user namespace
|
|
* or else we won't be able to reasonably tell userspace who
|
|
* or else we won't be able to reasonably tell userspace who
|
|
@@ -71,6 +72,12 @@ int create_user_ns(struct cred *new)
|
|
if (!ns)
|
|
if (!ns)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ ret = proc_alloc_inum(&ns->proc_inum);
|
|
|
|
+ if (ret) {
|
|
|
|
+ kmem_cache_free(user_ns_cachep, ns);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
+
|
|
kref_init(&ns->kref);
|
|
kref_init(&ns->kref);
|
|
/* Leave the new->user_ns reference with the new user namespace. */
|
|
/* Leave the new->user_ns reference with the new user namespace. */
|
|
ns->parent = parent_ns;
|
|
ns->parent = parent_ns;
|
|
@@ -103,6 +110,7 @@ void free_user_ns(struct kref *kref)
|
|
container_of(kref, struct user_namespace, kref);
|
|
container_of(kref, struct user_namespace, kref);
|
|
|
|
|
|
parent = ns->parent;
|
|
parent = ns->parent;
|
|
|
|
+ proc_free_inum(ns->proc_inum);
|
|
kmem_cache_free(user_ns_cachep, ns);
|
|
kmem_cache_free(user_ns_cachep, ns);
|
|
put_user_ns(parent);
|
|
put_user_ns(parent);
|
|
}
|
|
}
|
|
@@ -808,12 +816,19 @@ static int userns_install(struct nsproxy *nsproxy, void *ns)
|
|
return commit_creds(cred);
|
|
return commit_creds(cred);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static unsigned int userns_inum(void *ns)
|
|
|
|
+{
|
|
|
|
+ struct user_namespace *user_ns = ns;
|
|
|
|
+ return user_ns->proc_inum;
|
|
|
|
+}
|
|
|
|
+
|
|
const struct proc_ns_operations userns_operations = {
|
|
const struct proc_ns_operations userns_operations = {
|
|
.name = "user",
|
|
.name = "user",
|
|
.type = CLONE_NEWUSER,
|
|
.type = CLONE_NEWUSER,
|
|
.get = userns_get,
|
|
.get = userns_get,
|
|
.put = userns_put,
|
|
.put = userns_put,
|
|
.install = userns_install,
|
|
.install = userns_install,
|
|
|
|
+ .inum = userns_inum,
|
|
};
|
|
};
|
|
|
|
|
|
static __init int user_namespaces_init(void)
|
|
static __init int user_namespaces_init(void)
|