1 #include <linux/proc_fs.h>
2 #include <linux/nsproxy.h>
3 #include <linux/ptrace.h>
4 #include <linux/namei.h>
5 #include <linux/file.h>
6 #include <linux/utsname.h>
7 #include <net/net_namespace.h>
8 #include <linux/ipc_namespace.h>
9 #include <linux/pid_namespace.h>
10 #include <linux/user_namespace.h>
14 static const struct proc_ns_operations *ns_entries[] = {
33 static const char *proc_ns_follow_link(struct dentry *dentry, void **cookie)
35 struct inode *inode = d_inode(dentry);
36 const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops;
37 struct task_struct *task;
39 void *error = ERR_PTR(-EACCES);
41 task = get_proc_task(inode);
45 if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) {
46 error = ns_get_path(&ns_path, task, ns_ops);
48 nd_jump_link(&ns_path);
50 put_task_struct(task);
54 static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)
56 struct inode *inode = d_inode(dentry);
57 const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops;
58 struct task_struct *task;
62 task = get_proc_task(inode);
66 if (ptrace_may_access(task, PTRACE_MODE_READ_FSCREDS)) {
67 res = ns_get_name(name, sizeof(name), task, ns_ops);
69 res = readlink_copy(buffer, buflen, name);
71 put_task_struct(task);
75 static const struct inode_operations proc_ns_link_inode_operations = {
76 .readlink = proc_ns_readlink,
77 .follow_link = proc_ns_follow_link,
78 .setattr = proc_setattr,
81 static int proc_ns_instantiate(struct inode *dir,
82 struct dentry *dentry, struct task_struct *task, const void *ptr)
84 const struct proc_ns_operations *ns_ops = ptr;
86 struct proc_inode *ei;
88 inode = proc_pid_make_inode(dir->i_sb, task);
93 inode->i_mode = S_IFLNK|S_IRWXUGO;
94 inode->i_op = &proc_ns_link_inode_operations;
97 d_set_d_op(dentry, &pid_dentry_operations);
99 /* Close the race of the process dying before we return the dentry */
100 if (pid_revalidate(dentry, 0))
106 static int proc_ns_dir_readdir(struct file *file, struct dir_context *ctx)
108 struct task_struct *task = get_proc_task(file_inode(file));
109 const struct proc_ns_operations **entry, **last;
114 if (!dir_emit_dots(file, ctx))
116 if (ctx->pos >= 2 + ARRAY_SIZE(ns_entries))
118 entry = ns_entries + (ctx->pos - 2);
119 last = &ns_entries[ARRAY_SIZE(ns_entries) - 1];
120 while (entry <= last) {
121 const struct proc_ns_operations *ops = *entry;
122 if (!proc_fill_cache(file, ctx, ops->name, strlen(ops->name),
123 proc_ns_instantiate, task, ops))
129 put_task_struct(task);
133 const struct file_operations proc_ns_dir_operations = {
134 .read = generic_read_dir,
135 .iterate = proc_ns_dir_readdir,
138 static struct dentry *proc_ns_dir_lookup(struct inode *dir,
139 struct dentry *dentry, unsigned int flags)
142 struct task_struct *task = get_proc_task(dir);
143 const struct proc_ns_operations **entry, **last;
144 unsigned int len = dentry->d_name.len;
151 last = &ns_entries[ARRAY_SIZE(ns_entries)];
152 for (entry = ns_entries; entry < last; entry++) {
153 if (strlen((*entry)->name) != len)
155 if (!memcmp(dentry->d_name.name, (*entry)->name, len))
161 error = proc_ns_instantiate(dir, dentry, task, *entry);
163 put_task_struct(task);
165 return ERR_PTR(error);
168 const struct inode_operations proc_ns_dir_inode_operations = {
169 .lookup = proc_ns_dir_lookup,
170 .getattr = pid_getattr,
171 .setattr = proc_setattr,