Skip to content

Commit

Permalink
ecryptfs: use vfs_get_link()
Browse files Browse the repository at this point in the history
Here again we are copying form one buffer to another, while jumping through
hoops to make kernel memory look like userspace memory.

For no good reason, since vfs_get_link() provides exactly what is needed.

As a bonus, now the security hook for readlink is also called on the
underlying inode.

Note: this can be called from link-following context.  But this is okay:

 - not in RCU mode

 - commit e54ad7f ("proc: prevent stacking filesystems on top")

 - ecryptfs is *reading* the underlying symlink not following it, so the
   right security hook is being called

Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Cc: Tyler Hicks <tyhicks@canonical.com>
  • Loading branch information
Miklos Szeredi committed Dec 9, 2016
1 parent 3f9ca75 commit 6c988f5
Showing 1 changed file with 12 additions and 17 deletions.
29 changes: 12 additions & 17 deletions fs/ecryptfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -631,28 +631,23 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,

static char *ecryptfs_readlink_lower(struct dentry *dentry, size_t *bufsiz)
{
DEFINE_DELAYED_CALL(done);
struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
char *lower_buf;
const char *link;
char *buf;
mm_segment_t old_fs;
int rc;

lower_buf = kmalloc(PATH_MAX, GFP_KERNEL);
if (!lower_buf)
return ERR_PTR(-ENOMEM);
old_fs = get_fs();
set_fs(get_ds());
rc = d_inode(lower_dentry)->i_op->readlink(lower_dentry,
(char __user *)lower_buf,
PATH_MAX);
set_fs(old_fs);
if (rc < 0)
goto out;
link = vfs_get_link(lower_dentry, &done);
if (IS_ERR(link))
return ERR_CAST(link);

rc = ecryptfs_decode_and_decrypt_filename(&buf, bufsiz, dentry->d_sb,
lower_buf, rc);
out:
kfree(lower_buf);
return rc ? ERR_PTR(rc) : buf;
link, strlen(link));
do_delayed_call(&done);
if (rc)
return ERR_PTR(rc);

return buf;
}

static const char *ecryptfs_get_link(struct dentry *dentry,
Expand Down

0 comments on commit 6c988f5

Please sign in to comment.