summaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/symlink.c
diff options
context:
space:
mode:
authorOGAWA Hirofumi <hirofumi@mail.parknet.co.jp>2010-01-11 19:37:45 +0100
committerJoel Becker <joel.becker@oracle.com>2010-01-12 00:38:50 +0100
commit1dd473fdf1d8a7531e0955480cd129f9c1e8b8a3 (patch)
treebed53c5c5f93dc61ef074b5fcebc6bc86dc6e99b /fs/ocfs2/symlink.c
parentMerge branch 'for-linus' of git://oss.sgi.com/xfs/xfs (diff)
downloadlinux-1dd473fdf1d8a7531e0955480cd129f9c1e8b8a3.tar.xz
linux-1dd473fdf1d8a7531e0955480cd129f9c1e8b8a3.zip
ocfs2: Fix refcnt leak on ocfs2_fast_follow_link() error path
If ->follow_link handler returns an error, it should decrement nd->path refcnt. But ocfs2_fast_follow_link() doesn't decrement. This patch fixes the problem by using nd_set_link() style error handling instead of playing with nd->path. Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp> Signed-off-by: Joel Becker <joel.becker@oracle.com>
Diffstat (limited to 'fs/ocfs2/symlink.c')
-rw-r--r--fs/ocfs2/symlink.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/ocfs2/symlink.c b/fs/ocfs2/symlink.c
index 49b133ccbf11..32499d213fc4 100644
--- a/fs/ocfs2/symlink.c
+++ b/fs/ocfs2/symlink.c
@@ -137,20 +137,20 @@ static void *ocfs2_fast_follow_link(struct dentry *dentry,
}
memcpy(link, target, len);
- nd_set_link(nd, link);
bail:
+ nd_set_link(nd, status ? ERR_PTR(status) : link);
brelse(bh);
mlog_exit(status);
- return status ? ERR_PTR(status) : link;
+ return NULL;
}
static void ocfs2_fast_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
{
- char *link = cookie;
-
- kfree(link);
+ char *link = nd_get_link(nd);
+ if (!IS_ERR(link))
+ kfree(link);
}
const struct inode_operations ocfs2_symlink_inode_operations = {