lkml.org 
[lkml]   [2010]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH] ecryptfs: Fix refcnt leak on ecryptfs_follow_link() error path
    Date

    If ->follow_link handler return the error, it should decrement
    nd->path refcnt. But, ecryptfs_follow_link() doesn't decrement.

    This patch fix it by using usual nd_set_link() style error handling,
    instead of playing with nd->path.

    Signed-off-by: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
    ---

    fs/ecryptfs/inode.c | 19 +++++++++----------
    1 file changed, 9 insertions(+), 10 deletions(-)

    diff -puN fs/ecryptfs/inode.c~namei-ecryptfs-follow_link-fix fs/ecryptfs/inode.c
    --- linux-2.6/fs/ecryptfs/inode.c~namei-ecryptfs-follow_link-fix 2010-01-12 00:15:10.000000000 +0900
    +++ linux-2.6-hirofumi/fs/ecryptfs/inode.c 2010-01-12 00:15:10.000000000 +0900
    @@ -715,7 +715,7 @@ static void *ecryptfs_follow_link(struct
    /* Released in ecryptfs_put_link(); only release here on error */
    buf = kmalloc(len, GFP_KERNEL);
    if (!buf) {
    - rc = -ENOMEM;
    + buf = ERR_PTR(-ENOMEM);
    goto out;
    }
    old_fs = get_fs();
    @@ -723,23 +723,22 @@ static void *ecryptfs_follow_link(struct
    rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len);
    set_fs(old_fs);
    if (rc < 0)
    - goto out_free;
    + buf = ERR_PTR(rc);
    else
    buf[rc] = '\0';
    - rc = 0;
    - nd_set_link(nd, buf);
    - goto out;
    -out_free:
    - kfree(buf);
    out:
    - return ERR_PTR(rc);
    + nd_set_link(nd, buf);
    + return NULL;
    }

    static void
    ecryptfs_put_link(struct dentry *dentry, struct nameidata *nd, void *ptr)
    {
    - /* Free the char* */
    - kfree(nd_get_link(nd));
    + char *buf = nd_get_link(nd);
    + if (!IS_ERR(buf)) {
    + /* Free the char* */
    + kfree(buf);
    + }
    }

    /**
    _
    --
    OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>


    \
     
     \ /
      Last update: 2010-01-11 19:39    [W:0.022 / U:88.708 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site