namespaces.c (f01387d2693813eb5271a3448e6a082322c7d75d) namespaces.c (64964528b24ea390824f0e5ce9d34b8d39b28cde)
1#include <linux/proc_fs.h>
2#include <linux/nsproxy.h>
3#include <linux/sched.h>
4#include <linux/ptrace.h>
5#include <linux/fs_struct.h>
6#include <linux/mount.h>
7#include <linux/path.h>
8#include <linux/namei.h>

--- 50 unchanged lines hidden (view full) ---

59
60static struct dentry *proc_ns_get_dentry(struct super_block *sb,
61 struct task_struct *task, const struct proc_ns_operations *ns_ops)
62{
63 struct dentry *dentry, *result;
64 struct inode *inode;
65 struct proc_inode *ei;
66 struct qstr qname = { .name = "", };
1#include <linux/proc_fs.h>
2#include <linux/nsproxy.h>
3#include <linux/sched.h>
4#include <linux/ptrace.h>
5#include <linux/fs_struct.h>
6#include <linux/mount.h>
7#include <linux/path.h>
8#include <linux/namei.h>

--- 50 unchanged lines hidden (view full) ---

59
60static struct dentry *proc_ns_get_dentry(struct super_block *sb,
61 struct task_struct *task, const struct proc_ns_operations *ns_ops)
62{
63 struct dentry *dentry, *result;
64 struct inode *inode;
65 struct proc_inode *ei;
66 struct qstr qname = { .name = "", };
67 void *ns;
67 struct ns_common *ns;
68
69 ns = ns_ops->get(task);
70 if (!ns)
71 return ERR_PTR(-ENOENT);
72
73 dentry = d_alloc_pseudo(sb, &qname);
74 if (!dentry) {
75 ns_ops->put(ns);
76 return ERR_PTR(-ENOMEM);
77 }
78
68
69 ns = ns_ops->get(task);
70 if (!ns)
71 return ERR_PTR(-ENOENT);
72
73 dentry = d_alloc_pseudo(sb, &qname);
74 if (!dentry) {
75 ns_ops->put(ns);
76 return ERR_PTR(-ENOMEM);
77 }
78
79 inode = iget_locked(sb, ns_ops->inum(ns));
79 inode = iget_locked(sb, ns->inum);
80 if (!inode) {
81 dput(dentry);
82 ns_ops->put(ns);
83 return ERR_PTR(-ENOMEM);
84 }
85
86 ei = PROC_I(inode);
87 if (inode->i_state & I_NEW) {

--- 51 unchanged lines hidden (view full) ---

139}
140
141static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)
142{
143 struct inode *inode = dentry->d_inode;
144 struct proc_inode *ei = PROC_I(inode);
145 const struct proc_ns_operations *ns_ops = ei->ns.ns_ops;
146 struct task_struct *task;
80 if (!inode) {
81 dput(dentry);
82 ns_ops->put(ns);
83 return ERR_PTR(-ENOMEM);
84 }
85
86 ei = PROC_I(inode);
87 if (inode->i_state & I_NEW) {

--- 51 unchanged lines hidden (view full) ---

139}
140
141static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int buflen)
142{
143 struct inode *inode = dentry->d_inode;
144 struct proc_inode *ei = PROC_I(inode);
145 const struct proc_ns_operations *ns_ops = ei->ns.ns_ops;
146 struct task_struct *task;
147 void *ns;
147 struct ns_common *ns;
148 char name[50];
149 int res = -EACCES;
150
151 task = get_proc_task(inode);
152 if (!task)
153 goto out;
154
155 if (!ptrace_may_access(task, PTRACE_MODE_READ))
156 goto out_put_task;
157
158 res = -ENOENT;
159 ns = ns_ops->get(task);
160 if (!ns)
161 goto out_put_task;
162
148 char name[50];
149 int res = -EACCES;
150
151 task = get_proc_task(inode);
152 if (!task)
153 goto out;
154
155 if (!ptrace_may_access(task, PTRACE_MODE_READ))
156 goto out_put_task;
157
158 res = -ENOENT;
159 ns = ns_ops->get(task);
160 if (!ns)
161 goto out_put_task;
162
163 snprintf(name, sizeof(name), "%s:[%u]", ns_ops->name, ns_ops->inum(ns));
163 snprintf(name, sizeof(name), "%s:[%u]", ns_ops->name, ns->inum);
164 res = readlink_copy(buffer, buflen, name);
165 ns_ops->put(ns);
166out_put_task:
167 put_task_struct(task);
168out:
169 return res;
170}
171

--- 126 unchanged lines hidden ---
164 res = readlink_copy(buffer, buflen, name);
165 ns_ops->put(ns);
166out_put_task:
167 put_task_struct(task);
168out:
169 return res;
170}
171

--- 126 unchanged lines hidden ---