[linux-cifs-client] Re: [PATCH] cifs: fix pointer
initialization and checks in cifs_follow_symlink (try #3)
Christoph Hellwig
hch at infradead.org
Tue May 19 14:05:29 GMT 2009
On Tue, May 19, 2009 at 10:00:37AM -0400, Jeff Layton wrote:
> diff --git a/fs/cifs/link.c b/fs/cifs/link.c
> index ea9d11e..cd83c53 100644
> --- a/fs/cifs/link.c
> +++ b/fs/cifs/link.c
> @@ -107,48 +107,48 @@ void *
> cifs_follow_link(struct dentry *direntry, struct nameidata *nd)
> {
> struct inode *inode = direntry->d_inode;
> + int rc = -ENOMEM;
> int xid;
> char *full_path = NULL;
> + char *target_path = NULL;
> + struct cifs_sb_info *cifs_sb = CIFS_SB(inode->i_sb);
> + struct cifsTconInfo *tcon = cifs_sb->tcon;
>
> xid = GetXid();
>
> + /*
> + * For now, we just handle symlinks with unix extensions enabled.
> + * Eventually we should handle NTFS reparse points, and MacOS
> + * symlink support. For instance...
> + *
> + * rc = CIFSSMBQueryReparseLinkInfo(...)
> + *
> + * For now, just return -EACCES when the server doesn't support posix
> + * extensions. Note that we still allow querying symlinks when posix
> + * extensions are manually disabled. We could disable these as well
> + * but there doesn't seem to be any harm in allowing the client to
> + * read them.
> + */
> + if (!(tcon->ses->capabilities & CAP_UNIX)) {
> + rc = -EACCES;
> + goto out;
> + }
>
> + full_path = build_path_from_dentry(direntry);
> if (!full_path)
> goto out;
>
> cFYI(1, ("Full path: %s inode = 0x%p", full_path, inode));
>
> + rc = CIFSSMBUnixQuerySymLink(xid, tcon, full_path, &target_path,
> + cifs_sb->local_nls);
> + kfree(full_path);
> +out:
> if (rc != 0) {
> kfree(target_path);
> target_path = ERR_PTR(rc);
> }
Looks good.
More information about the linux-cifs-client
mailing list