Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b515498f authored by Serge E. Hallyn's avatar Serge E. Hallyn Committed by Linus Torvalds
Browse files

userns: add a user namespace owner of ipc ns



Changelog:
	Feb 15: Don't set new ipc->user_ns if we didn't create a new
		ipc_ns.
	Feb 23: Move extern declaration to ipc_namespace.h, and group
		fwd declarations at top.

Signed-off-by: default avatarSerge E. Hallyn <serge.hallyn@canonical.com>
Acked-by: default avatar"Eric W. Biederman" <ebiederm@xmission.com>
Acked-by: default avatarDaniel Lezcano <daniel.lezcano@free.fr>
Acked-by: default avatarDavid Howells <dhowells@redhat.com>
Cc: James Morris <jmorris@namei.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent fc832ad3
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@

#define IPCNS_CALLBACK_PRI 0

struct user_namespace;

struct ipc_ids {
	int in_use;
@@ -56,6 +57,8 @@ struct ipc_namespace {
	unsigned int    mq_msg_max;      /* initialized to DFLT_MSGMAX */
	unsigned int    mq_msgsize_max;  /* initialized to DFLT_MSGSIZEMAX */

	/* user_ns which owns the ipc ns */
	struct user_namespace *user_ns;
};

extern struct ipc_namespace init_ipc_ns;
+1 −0
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ struct ipc_namespace init_ipc_ns = {
	.mq_msg_max      = DFLT_MSGMAX,
	.mq_msgsize_max  = DFLT_MSGSIZEMAX,
#endif
	.user_ns = &init_user_ns,
};

atomic_t nr_ipc_ns = ATOMIC_INIT(1);
+7 −2
Original line number Diff line number Diff line
@@ -11,10 +11,11 @@
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/mount.h>
#include <linux/user_namespace.h>

#include "util.h"

static struct ipc_namespace *create_ipc_ns(void)
static struct ipc_namespace *create_ipc_ns(struct ipc_namespace *old_ns)
{
	struct ipc_namespace *ns;
	int err;
@@ -43,6 +44,9 @@ static struct ipc_namespace *create_ipc_ns(void)
	ipcns_notify(IPCNS_CREATED);
	register_ipcns_notifier(ns);

	ns->user_ns = old_ns->user_ns;
	get_user_ns(ns->user_ns);

	return ns;
}

@@ -50,7 +54,7 @@ struct ipc_namespace *copy_ipcs(unsigned long flags, struct ipc_namespace *ns)
{
	if (!(flags & CLONE_NEWIPC))
		return get_ipc_ns(ns);
	return create_ipc_ns();
	return create_ipc_ns(ns);
}

/*
@@ -105,6 +109,7 @@ static void free_ipc_ns(struct ipc_namespace *ns)
	 * order to have a correct value when recomputing msgmni.
	 */
	ipcns_notify(IPCNS_REMOVED);
	put_user_ns(ns->user_ns);
}

/*
+5 −0
Original line number Diff line number Diff line
@@ -80,6 +80,11 @@ static struct nsproxy *create_new_namespaces(unsigned long flags,
		err = PTR_ERR(new_nsp->ipc_ns);
		goto out_ipc;
	}
	if (new_nsp->ipc_ns != tsk->nsproxy->ipc_ns) {
		put_user_ns(new_nsp->ipc_ns->user_ns);
		new_nsp->ipc_ns->user_ns = task_cred_xxx(tsk, user)->user_ns;
		get_user_ns(new_nsp->ipc_ns->user_ns);
	}

	new_nsp->pid_ns = copy_pid_ns(flags, task_active_pid_ns(tsk));
	if (IS_ERR(new_nsp->pid_ns)) {