(6/9) symlink patchkit (against -bk current)
PATCH 1/1 (6/9) symlink patchkit (against -bk current)
xfs switched to new scheme; leaks plugged.
fs/xfs/linux-2.6/xfs_iops.c +20 -11
@@ -67,6 +67,7 @@#include "xfs_utils.h" #include <linux/xattr.h> +#include <linux/namei.h> /*
@@ -419,13 +420,16 @@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 @@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_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,