lkml.org 
[lkml]   [2017]   [May]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.18 19/49] ceph: fix memory leak in __ceph_setxattr()
    Date
    3.18-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Luis Henriques <lhenriques@suse.com>

    commit eeca958dce0a9231d1969f86196653eb50fcc9b3 upstream.

    The ceph_inode_xattr needs to be released when removing an xattr. Easily
    reproducible running the 'generic/020' test from xfstests or simply by
    doing:

    attr -s attr0 -V 0 /mnt/test && attr -r attr0 /mnt/test

    While there, also fix the error path.

    Here's the kmemleak splat:

    unreferenced object 0xffff88001f86fbc0 (size 64):
    comm "attr", pid 244, jiffies 4294904246 (age 98.464s)
    hex dump (first 32 bytes):
    40 fa 86 1f 00 88 ff ff 80 32 38 1f 00 88 ff ff @........28.....
    00 01 00 00 00 00 ad de 00 02 00 00 00 00 ad de ................
    backtrace:
    [<ffffffff81560199>] kmemleak_alloc+0x49/0xa0
    [<ffffffff810f3e5b>] kmem_cache_alloc+0x9b/0xf0
    [<ffffffff812b157e>] __ceph_setxattr+0x17e/0x820
    [<ffffffff812b1c57>] ceph_set_xattr_handler+0x37/0x40
    [<ffffffff8111fb4b>] __vfs_removexattr+0x4b/0x60
    [<ffffffff8111fd37>] vfs_removexattr+0x77/0xd0
    [<ffffffff8111fdd1>] removexattr+0x41/0x60
    [<ffffffff8111fe65>] path_removexattr+0x75/0xa0
    [<ffffffff81120aeb>] SyS_lremovexattr+0xb/0x10
    [<ffffffff81564b20>] entry_SYSCALL_64_fastpath+0x13/0x94
    [<ffffffffffffffff>] 0xffffffffffffffff

    Signed-off-by: Luis Henriques <lhenriques@suse.com>
    Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
    Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    fs/ceph/xattr.c | 3 +++
    1 file changed, 3 insertions(+)

    --- a/fs/ceph/xattr.c
    +++ b/fs/ceph/xattr.c
    @@ -369,6 +369,7 @@ static int __set_xattr(struct ceph_inode

    if (update_xattr) {
    int err = 0;
    +
    if (xattr && (flags & XATTR_CREATE))
    err = -EEXIST;
    else if (!xattr && (flags & XATTR_REPLACE))
    @@ -376,12 +377,14 @@ static int __set_xattr(struct ceph_inode
    if (err) {
    kfree(name);
    kfree(val);
    + kfree(*newxattr);
    return err;
    }
    if (update_xattr < 0) {
    if (xattr)
    __remove_xattr(ci, xattr);
    kfree(name);
    + kfree(*newxattr);
    return 0;
    }
    }

    \
     
     \ /
      Last update: 2017-05-18 15:31    [W:2.292 / U:0.308 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site