|
@@ -11,10 +11,11 @@
|
|
#include <linux/slab.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/fs.h>
|
|
#include <linux/mount.h>
|
|
#include <linux/mount.h>
|
|
|
|
+#include <linux/user_namespace.h>
|
|
|
|
|
|
#include "util.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;
|
|
struct ipc_namespace *ns;
|
|
int err;
|
|
int err;
|
|
@@ -43,6 +44,9 @@ static struct ipc_namespace *create_ipc_ns(void)
|
|
ipcns_notify(IPCNS_CREATED);
|
|
ipcns_notify(IPCNS_CREATED);
|
|
register_ipcns_notifier(ns);
|
|
register_ipcns_notifier(ns);
|
|
|
|
|
|
|
|
+ ns->user_ns = old_ns->user_ns;
|
|
|
|
+ get_user_ns(ns->user_ns);
|
|
|
|
+
|
|
return ns;
|
|
return ns;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -50,7 +54,7 @@ struct ipc_namespace *copy_ipcs(unsigned long flags, struct ipc_namespace *ns)
|
|
{
|
|
{
|
|
if (!(flags & CLONE_NEWIPC))
|
|
if (!(flags & CLONE_NEWIPC))
|
|
return get_ipc_ns(ns);
|
|
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.
|
|
* order to have a correct value when recomputing msgmni.
|
|
*/
|
|
*/
|
|
ipcns_notify(IPCNS_REMOVED);
|
|
ipcns_notify(IPCNS_REMOVED);
|
|
|
|
+ put_user_ns(ns->user_ns);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|