Skip to content

Commit

Permalink
proc: make proc entries inherit ownership from parent
Browse files Browse the repository at this point in the history
There are certain parameters that belong to net namespace and that are
exported in /proc. They should be controllable by the container's owner,
but are currently owned by global root and thus not available.

Let's change proc code to inherit ownership of parent entry, and when
create per-ns "net" proc entry set it up as owned by container's owner.

Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Dmitry Torokhov authored and David S. Miller committed Aug 15, 2016
1 parent f8c46cb commit c110486
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 0 deletions.
2 changes: 2 additions & 0 deletions fs/proc/generic.c
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,8 @@ static struct proc_dir_entry *__proc_create(struct proc_dir_entry **parent,
atomic_set(&ent->count, 1);
spin_lock_init(&ent->pde_unload_lock);
INIT_LIST_HEAD(&ent->pde_openers);
proc_set_user(ent, (*parent)->uid, (*parent)->gid);

out:
return ent;
}
Expand Down
13 changes: 13 additions & 0 deletions fs/proc/proc_net.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <linux/bitops.h>
#include <linux/mount.h>
#include <linux/nsproxy.h>
#include <linux/uidgid.h>
#include <net/net_namespace.h>
#include <linux/seq_file.h>

Expand Down Expand Up @@ -185,6 +186,8 @@ const struct file_operations proc_net_operations = {
static __net_init int proc_net_ns_init(struct net *net)
{
struct proc_dir_entry *netd, *net_statd;
kuid_t uid;
kgid_t gid;
int err;

err = -ENOMEM;
Expand All @@ -199,6 +202,16 @@ static __net_init int proc_net_ns_init(struct net *net)
netd->parent = &proc_root;
memcpy(netd->name, "net", 4);

uid = make_kuid(net->user_ns, 0);
if (!uid_valid(uid))
uid = netd->uid;

gid = make_kgid(net->user_ns, 0);
if (!gid_valid(gid))
gid = netd->gid;

proc_set_user(netd, uid, gid);

err = -EEXIST;
net_statd = proc_net_mkdir(net, "stat", netd);
if (!net_statd)
Expand Down

0 comments on commit c110486

Please sign in to comment.