projects
/
firefly-linux-kernel-4.4.55.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ia64: kill thread_matches(), unexport ptrace_check_attach()
[firefly-linux-kernel-4.4.55.git]
/
kernel
/
utsname.c
diff --git
a/kernel/utsname.c
b/kernel/utsname.c
index 679d97a5d3fdf95c7f22958bc3f8276dd0657984..08b197e8c485e4cb79dcee37a1b578f45566ad68 100644
(file)
--- a/
kernel/utsname.c
+++ b/
kernel/utsname.c
@@
-32,18
+32,25
@@
static struct uts_namespace *create_uts_ns(void)
* @old_ns: namespace to clone
* Return NULL on error (failure to kmalloc), new ns otherwise
*/
* @old_ns: namespace to clone
* Return NULL on error (failure to kmalloc), new ns otherwise
*/
-static struct uts_namespace *clone_uts_ns(struct
task_struct *tsk
,
+static struct uts_namespace *clone_uts_ns(struct
user_namespace *user_ns
,
struct uts_namespace *old_ns)
{
struct uts_namespace *ns;
struct uts_namespace *old_ns)
{
struct uts_namespace *ns;
+ int err;
ns = create_uts_ns();
if (!ns)
return ERR_PTR(-ENOMEM);
ns = create_uts_ns();
if (!ns)
return ERR_PTR(-ENOMEM);
+ err = proc_alloc_inum(&ns->proc_inum);
+ if (err) {
+ kfree(ns);
+ return ERR_PTR(err);
+ }
+
down_read(&uts_sem);
memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
down_read(&uts_sem);
memcpy(&ns->name, &old_ns->name, sizeof(ns->name));
- ns->user_ns = get_user_ns(
task_cred_xxx(tsk, user_ns)
);
+ ns->user_ns = get_user_ns(
user_ns
);
up_read(&uts_sem);
return ns;
}
up_read(&uts_sem);
return ns;
}
@@
-55,9
+62,8
@@
static struct uts_namespace *clone_uts_ns(struct task_struct *tsk,
* versa.
*/
struct uts_namespace *copy_utsname(unsigned long flags,
* versa.
*/
struct uts_namespace *copy_utsname(unsigned long flags,
-
struct task_struct *tsk
)
+
struct user_namespace *user_ns, struct uts_namespace *old_ns
)
{
{
- struct uts_namespace *old_ns = tsk->nsproxy->uts_ns;
struct uts_namespace *new_ns;
BUG_ON(!old_ns);
struct uts_namespace *new_ns;
BUG_ON(!old_ns);
@@
-66,7
+72,7
@@
struct uts_namespace *copy_utsname(unsigned long flags,
if (!(flags & CLONE_NEWUTS))
return old_ns;
if (!(flags & CLONE_NEWUTS))
return old_ns;
- new_ns = clone_uts_ns(
tsk
, old_ns);
+ new_ns = clone_uts_ns(
user_ns
, old_ns);
put_uts_ns(old_ns);
return new_ns;
put_uts_ns(old_ns);
return new_ns;
@@
-78,6
+84,7
@@
void free_uts_ns(struct kref *kref)
ns = container_of(kref, struct uts_namespace, kref);
put_user_ns(ns->user_ns);
ns = container_of(kref, struct uts_namespace, kref);
put_user_ns(ns->user_ns);
+ proc_free_inum(ns->proc_inum);
kfree(ns);
}
kfree(ns);
}
@@
-102,19
+109,32
@@
static void utsns_put(void *ns)
put_uts_ns(ns);
}
put_uts_ns(ns);
}
-static int utsns_install(struct nsproxy *nsproxy, void *n
s
)
+static int utsns_install(struct nsproxy *nsproxy, void *n
ew
)
{
{
+ struct uts_namespace *ns = new;
+
+ if (!ns_capable(ns->user_ns, CAP_SYS_ADMIN) ||
+ !nsown_capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
get_uts_ns(ns);
put_uts_ns(nsproxy->uts_ns);
nsproxy->uts_ns = ns;
return 0;
}
get_uts_ns(ns);
put_uts_ns(nsproxy->uts_ns);
nsproxy->uts_ns = ns;
return 0;
}
+static unsigned int utsns_inum(void *vp)
+{
+ struct uts_namespace *ns = vp;
+
+ return ns->proc_inum;
+}
+
const struct proc_ns_operations utsns_operations = {
.name = "uts",
.type = CLONE_NEWUTS,
.get = utsns_get,
.put = utsns_put,
.install = utsns_install,
const struct proc_ns_operations utsns_operations = {
.name = "uts",
.type = CLONE_NEWUTS,
.get = utsns_get,
.put = utsns_put,
.install = utsns_install,
+ .inum = utsns_inum,
};
};
-