diff options
Diffstat (limited to 'fs/proc/base.c')
| -rw-r--r-- | fs/proc/base.c | 24 | 
1 files changed, 19 insertions, 5 deletions
| diff --git a/fs/proc/base.c b/fs/proc/base.c index e42bbd843ed1..58324c299165 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -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;  	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 = {  	.readlink	= proc_self_readlink,  	.follow_link	= proc_self_follow_link, +	.put_link	= proc_self_put_link,  };  /* | 
