lkml.org 
[lkml]   [2019]   [Sep]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 39/40] mld: fix memory leak in mld_del_delrec()
    Date
    From: Eric Dumazet <edumazet@google.com>

    [ Upstream commit a84d016479896b5526a2cc54784e6ffc41c9d6f6 ]

    Similar to the fix done for IPv4 in commit e5b1c6c6277d
    ("igmp: fix memory leak in igmpv3_del_delrec()"), we need to
    make sure mca_tomb and mca_sources are not blindly overwritten.

    Using swap() then a call to ip6_mc_clear_src() will take care
    of the missing free.

    BUG: memory leak
    unreferenced object 0xffff888117d9db00 (size 64):
    comm "syz-executor247", pid 6918, jiffies 4294943989 (age 25.350s)
    hex dump (first 32 bytes):
    00 00 00 00 00 00 00 00 fe 88 00 00 00 00 00 00 ................
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
    backtrace:
    [<000000005b463030>] kmemleak_alloc_recursive include/linux/kmemleak.h:43 [inline]
    [<000000005b463030>] slab_post_alloc_hook mm/slab.h:522 [inline]
    [<000000005b463030>] slab_alloc mm/slab.c:3319 [inline]
    [<000000005b463030>] kmem_cache_alloc_trace+0x145/0x2c0 mm/slab.c:3548
    [<00000000939cbf94>] kmalloc include/linux/slab.h:552 [inline]
    [<00000000939cbf94>] kzalloc include/linux/slab.h:748 [inline]
    [<00000000939cbf94>] ip6_mc_add1_src net/ipv6/mcast.c:2236 [inline]
    [<00000000939cbf94>] ip6_mc_add_src+0x31f/0x420 net/ipv6/mcast.c:2356
    [<00000000d8972221>] ip6_mc_source+0x4a8/0x600 net/ipv6/mcast.c:449
    [<000000002b203d0d>] do_ipv6_setsockopt.isra.0+0x1b92/0x1dd0 net/ipv6/ipv6_sockglue.c:748
    [<000000001f1e2d54>] ipv6_setsockopt+0x89/0xd0 net/ipv6/ipv6_sockglue.c:944
    [<00000000c8f7bdf9>] udpv6_setsockopt+0x4e/0x90 net/ipv6/udp.c:1558
    [<000000005a9a0c5e>] sock_common_setsockopt+0x38/0x50 net/core/sock.c:3139
    [<00000000910b37b2>] __sys_setsockopt+0x10f/0x220 net/socket.c:2084
    [<00000000e9108023>] __do_sys_setsockopt net/socket.c:2100 [inline]
    [<00000000e9108023>] __se_sys_setsockopt net/socket.c:2097 [inline]
    [<00000000e9108023>] __x64_sys_setsockopt+0x26/0x30 net/socket.c:2097
    [<00000000f4818160>] do_syscall_64+0x76/0x1a0 arch/x86/entry/common.c:296
    [<000000008d367e8f>] entry_SYSCALL_64_after_hwframe+0x44/0xa9

    Fixes: 1666d49e1d41 ("mld: do not remove mld souce list info when set link down")
    Fixes: 9c8bb163ae78 ("igmp, mld: Fix memory leak in igmpv3/mld_del_delrec()")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: syzbot <syzkaller@googlegroups.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/ipv6/mcast.c | 5 +++--
    1 file changed, 3 insertions(+), 2 deletions(-)

    --- a/net/ipv6/mcast.c
    +++ b/net/ipv6/mcast.c
    @@ -772,12 +772,13 @@ static void mld_del_delrec(struct inet6_
    im->idev = pmc->idev;
    im->mca_crcount = idev->mc_qrv;
    if (im->mca_sfmode == MCAST_INCLUDE) {
    - im->mca_tomb = pmc->mca_tomb;
    - im->mca_sources = pmc->mca_sources;
    + swap(im->mca_tomb, pmc->mca_tomb);
    + swap(im->mca_sources, pmc->mca_sources);
    for (psf = im->mca_sources; psf; psf = psf->sf_next)
    psf->sf_crcount = im->mca_crcount;
    }
    in6_dev_put(pmc->idev);
    + ip6_mc_clear_src(pmc);
    kfree(pmc);
    }
    spin_unlock_bh(&im->mca_lock);

    \
     
     \ /
      Last update: 2019-09-08 14:59    [W:4.061 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site