|
@@ -2369,16 +2369,30 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
|
|
{
|
|
{
|
|
struct pid_namespace *ns = dentry->d_sb->s_fs_info;
|
|
struct pid_namespace *ns = dentry->d_sb->s_fs_info;
|
|
pid_t tgid = task_tgid_nr_ns(current, ns);
|
|
pid_t tgid = task_tgid_nr_ns(current, ns);
|
|
- char tmp[PROC_NUMBUF];
|
|
|
|
- if (!tgid)
|
|
|
|
- return ERR_PTR(-ENOENT);
|
|
|
|
- sprintf(tmp, "%d", task_tgid_nr_ns(current, ns));
|
|
|
|
- return ERR_PTR(vfs_follow_link(nd,tmp));
|
|
|
|
|
|
+ char *name = ERR_PTR(-ENOENT);
|
|
|
|
+ if (tgid) {
|
|
|
|
+ name = __getname();
|
|
|
|
+ if (!name)
|
|
|
|
+ name = ERR_PTR(-ENOMEM);
|
|
|
|
+ else
|
|
|
|
+ sprintf(name, "%d", tgid);
|
|
|
|
+ }
|
|
|
|
+ nd_set_link(nd, name);
|
|
|
|
+ return NULL;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd,
|
|
|
|
+ void *cookie)
|
|
|
|
+{
|
|
|
|
+ char *s = nd_get_link(nd);
|
|
|
|
+ if (!IS_ERR(s))
|
|
|
|
+ __putname(s);
|
|
}
|
|
}
|
|
|
|
|
|
static const struct inode_operations proc_self_inode_operations = {
|
|
static const struct inode_operations proc_self_inode_operations = {
|
|
.readlink = proc_self_readlink,
|
|
.readlink = proc_self_readlink,
|
|
.follow_link = proc_self_follow_link,
|
|
.follow_link = proc_self_follow_link,
|
|
|
|
+ .put_link = proc_self_put_link,
|
|
};
|
|
};
|
|
|
|
|
|
/*
|
|
/*
|