diff options
author | Pavel Emelyanov <xemul@openvz.org> | 2008-03-07 14:08:40 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-03-07 14:08:40 -0500 |
commit | e9720acd728a46cb40daa52c99a979f7c4ff195c (patch) | |
tree | 01380f601384cf93f30dedb64afe80359fecb807 /fs/proc/base.c | |
parent | 1ff82fe0024e8070c38346b8abc1ff09612dea4c (diff) |
[NET]: Make /proc/net a symlink on /proc/self/net (v3)
Current /proc/net is done with so called "shadows", but current
implementation is broken and has little chances to get fixed.
The problem is that dentries subtree of /proc/net directory has
fancy revalidation rules to make processes living in different
net namespaces see different entries in /proc/net subtree, but
currently, tasks see in the /proc/net subdir the contents of any
other namespace, depending on who opened the file first.
The proposed fix is to turn /proc/net into a symlink, which points
to /proc/self/net, which in turn shows what previously was in
/proc/net - the network-related info, from the net namespace the
appropriate task lives in.
# ls -l /proc/net
lrwxrwxrwx 1 root root 8 Mar 5 15:17 /proc/net -> self/net
In other words - this behaves like /proc/mounts, but unlike
"mounts", "net" is not a file, but a directory.
Changes from v2:
* Fixed discrepancy of /proc/net nlink count and selinux labeling
screwup pointed out by Stephen.
To get the correct nlink count the ->getattr callback for /proc/net
is overridden to read one from the net->proc_net entry.
To make selinux still work the net->proc_net entry is initialized
properly, i.e. with the "net" name and the proc_net parent.
Selinux fixes are
Acked-by: Stephen Smalley <sds@tycho.nsa.gov>
Changes from v1:
* Fixed a task_struct leak in get_proc_task_net, pointed out by Paul.
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Acked-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index 96ee899d6502..cc43cf0c1fa5 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2274,6 +2274,7 @@ static const struct pid_entry tgid_base_stuff[] = { | |||
2274 | DIR("task", S_IRUGO|S_IXUGO, task), | 2274 | DIR("task", S_IRUGO|S_IXUGO, task), |
2275 | DIR("fd", S_IRUSR|S_IXUSR, fd), | 2275 | DIR("fd", S_IRUSR|S_IXUSR, fd), |
2276 | DIR("fdinfo", S_IRUSR|S_IXUSR, fdinfo), | 2276 | DIR("fdinfo", S_IRUSR|S_IXUSR, fdinfo), |
2277 | DIR("net", S_IRUGO|S_IXUSR, net), | ||
2277 | REG("environ", S_IRUSR, environ), | 2278 | REG("environ", S_IRUSR, environ), |
2278 | INF("auxv", S_IRUSR, pid_auxv), | 2279 | INF("auxv", S_IRUSR, pid_auxv), |
2279 | ONE("status", S_IRUGO, pid_status), | 2280 | ONE("status", S_IRUGO, pid_status), |