eCryptfs: check readlink result was not an error before using it
authorDuane Griffin <duaneg@dghda.com>
Fri, 19 Dec 2008 20:47:10 +0000 (20:47 +0000)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 31 Dec 2008 23:07:38 +0000 (18:07 -0500)
The result from readlink is being used to index into the link name
buffer without checking whether it is a valid length. If readlink
returns an error this will fault or cause memory corruption.

Cc: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
Cc: Dustin Kirkland <kirkland@canonical.com>
Cc: ecryptfs-devel@lists.launchpad.net
Signed-off-by: Duane Griffin <duaneg@dghda.com>
Acked-by: Michael Halcrow <mhalcrow@us.ibm.com>
Acked-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/ecryptfs/inode.c

index 89209f00f9c74ecc752ed944f26ecff6e2f5c974..5e78fc179886e6364f4a0d3a7019ee2d5274d9fb 100644 (file)
@@ -673,10 +673,11 @@ static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd)
        ecryptfs_printk(KERN_DEBUG, "Calling readlink w/ "
                        "dentry->d_name.name = [%s]\n", dentry->d_name.name);
        rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len);
-       buf[rc] = '\0';
        set_fs(old_fs);
        if (rc < 0)
                goto out_free;
+       else
+               buf[rc] = '\0';
        rc = 0;
        nd_set_link(nd, buf);
        goto out;