Commit 077688a9 authored by Alexander Viro's avatar Alexander Viro Committed by Linus Torvalds

[PATCH] symlink 6/9: xfs

xfs switched to new scheme; leaks plugged.
parent faa1bb09
......@@ -67,6 +67,7 @@
#include "xfs_utils.h"
#include <linux/xattr.h>
#include <linux/namei.h>
/*
......@@ -419,13 +420,16 @@ linvfs_follow_link(
ASSERT(nd);
link = (char *)kmalloc(MAXNAMELEN+1, GFP_KERNEL);
if (!link)
return -ENOMEM;
if (!link) {
nd_set_link(nd, ERR_PTR(-ENOMEM));
return 0;
}
uio = (uio_t *)kmalloc(sizeof(uio_t), GFP_KERNEL);
if (!uio) {
kfree(link);
return -ENOMEM;
nd_set_link(nd, ERR_PTR(-ENOMEM));
return 0;
}
vp = LINVFS_GET_VP(dentry->d_inode);
......@@ -441,18 +445,22 @@ linvfs_follow_link(
VOP_READLINK(vp, uio, 0, NULL, error);
if (error) {
kfree(uio);
kfree(link);
return -error;
link = ERR_PTR(-error);
} else {
link[MAXNAMELEN - uio->uio_resid] = '\0';
}
link[MAXNAMELEN - uio->uio_resid] = '\0';
kfree(uio);
/* vfs_follow_link returns (-) errors */
error = vfs_follow_link(nd, link);
kfree(link);
return error;
nd_set_link(nd, link);
return 0;
}
static void linvfs_put_link(struct dentry *dentry, struct nameidata *nd)
{
char *s = nd_get_link(nd);
if (!IS_ERR(s))
kfree(s);
}
#ifdef CONFIG_XFS_POSIX_ACL
......@@ -692,6 +700,7 @@ struct inode_operations linvfs_dir_inode_operations = {
struct inode_operations linvfs_symlink_inode_operations = {
.readlink = linvfs_readlink,
.follow_link = linvfs_follow_link,
.put_link = linvfs_put_link,
.permission = linvfs_permission,
.getattr = linvfs_getattr,
.setattr = linvfs_setattr,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment