From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
Hangbin Liu <liuhangbin@gmail.com>,
syzbot <syzkaller@googlegroups.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 5.1 05/40] ipv4/igmp: fix another memory leak in igmpv3_del_delrec()
Date: Mon, 3 Jun 2019 11:08:58 +0200 [thread overview]
Message-ID: <20190603090522.960391894@linuxfoundation.org> (raw)
In-Reply-To: <20190603090522.617635820@linuxfoundation.org>
From: Eric Dumazet <edumazet@google.com>
[ Upstream commit 3580d04aa674383c42de7b635d28e52a1e5bc72c ]
syzbot reported memory leaks [1] that I have back tracked to
a missing cleanup from igmpv3_del_delrec() when
(im->sfmode != MCAST_INCLUDE)
Add ip_sf_list_clear_all() and kfree_pmc() helpers to explicitely
handle the cleanups before freeing.
[1]
BUG: memory leak
unreferenced object 0xffff888123e32b00 (size 64):
comm "softirq", pid 0, jiffies 4294942968 (age 8.010s)
hex dump (first 32 bytes):
00 00 00 00 00 00 00 00 e0 00 00 01 00 00 00 00 ................
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
backtrace:
[<000000006105011b>] kmemleak_alloc_recursive include/linux/kmemleak.h:55 [inline]
[<000000006105011b>] slab_post_alloc_hook mm/slab.h:439 [inline]
[<000000006105011b>] slab_alloc mm/slab.c:3326 [inline]
[<000000006105011b>] kmem_cache_alloc_trace+0x13d/0x280 mm/slab.c:3553
[<000000004bba8073>] kmalloc include/linux/slab.h:547 [inline]
[<000000004bba8073>] kzalloc include/linux/slab.h:742 [inline]
[<000000004bba8073>] ip_mc_add1_src net/ipv4/igmp.c:1961 [inline]
[<000000004bba8073>] ip_mc_add_src+0x36b/0x400 net/ipv4/igmp.c:2085
[<00000000a46a65a0>] ip_mc_msfilter+0x22d/0x310 net/ipv4/igmp.c:2475
[<000000005956ca89>] do_ip_setsockopt.isra.0+0x1795/0x1930 net/ipv4/ip_sockglue.c:957
[<00000000848e2d2f>] ip_setsockopt+0x3b/0xb0 net/ipv4/ip_sockglue.c:1246
[<00000000b9db185c>] udp_setsockopt+0x4e/0x90 net/ipv4/udp.c:2616
[<000000003028e438>] sock_common_setsockopt+0x38/0x50 net/core/sock.c:3130
[<0000000015b65589>] __sys_setsockopt+0x98/0x120 net/socket.c:2078
[<00000000ac198ef0>] __do_sys_setsockopt net/socket.c:2089 [inline]
[<00000000ac198ef0>] __se_sys_setsockopt net/socket.c:2086 [inline]
[<00000000ac198ef0>] __x64_sys_setsockopt+0x26/0x30 net/socket.c:2086
[<000000000a770437>] do_syscall_64+0x76/0x1a0 arch/x86/entry/common.c:301
[<00000000d3adb93b>] entry_SYSCALL_64_after_hwframe+0x44/0xa9
Fixes: 9c8bb163ae78 ("igmp, mld: Fix memory leak in igmpv3/mld_del_delrec()")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Hangbin Liu <liuhangbin@gmail.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/ipv4/igmp.c | 47 ++++++++++++++++++++++++++++++-----------------
1 file changed, 30 insertions(+), 17 deletions(-)
--- a/net/ipv4/igmp.c
+++ b/net/ipv4/igmp.c
@@ -633,6 +633,24 @@ static void igmpv3_clear_zeros(struct ip
}
}
+static void ip_sf_list_clear_all(struct ip_sf_list *psf)
+{
+ struct ip_sf_list *next;
+
+ while (psf) {
+ next = psf->sf_next;
+ kfree(psf);
+ psf = next;
+ }
+}
+
+static void kfree_pmc(struct ip_mc_list *pmc)
+{
+ ip_sf_list_clear_all(pmc->sources);
+ ip_sf_list_clear_all(pmc->tomb);
+ kfree(pmc);
+}
+
static void igmpv3_send_cr(struct in_device *in_dev)
{
struct ip_mc_list *pmc, *pmc_prev, *pmc_next;
@@ -669,7 +687,7 @@ static void igmpv3_send_cr(struct in_dev
else
in_dev->mc_tomb = pmc_next;
in_dev_put(pmc->interface);
- kfree(pmc);
+ kfree_pmc(pmc);
} else
pmc_prev = pmc;
}
@@ -1215,14 +1233,18 @@ static void igmpv3_del_delrec(struct in_
im->interface = pmc->interface;
if (im->sfmode == MCAST_INCLUDE) {
im->tomb = pmc->tomb;
+ pmc->tomb = NULL;
+
im->sources = pmc->sources;
+ pmc->sources = NULL;
+
for (psf = im->sources; psf; psf = psf->sf_next)
psf->sf_crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
} else {
im->crcount = in_dev->mr_qrv ?: net->ipv4.sysctl_igmp_qrv;
}
in_dev_put(pmc->interface);
- kfree(pmc);
+ kfree_pmc(pmc);
}
spin_unlock_bh(&im->lock);
}
@@ -1243,21 +1265,18 @@ static void igmpv3_clear_delrec(struct i
nextpmc = pmc->next;
ip_mc_clear_src(pmc);
in_dev_put(pmc->interface);
- kfree(pmc);
+ kfree_pmc(pmc);
}
/* clear dead sources, too */
rcu_read_lock();
for_each_pmc_rcu(in_dev, pmc) {
- struct ip_sf_list *psf, *psf_next;
+ struct ip_sf_list *psf;
spin_lock_bh(&pmc->lock);
psf = pmc->tomb;
pmc->tomb = NULL;
spin_unlock_bh(&pmc->lock);
- for (; psf; psf = psf_next) {
- psf_next = psf->sf_next;
- kfree(psf);
- }
+ ip_sf_list_clear_all(psf);
}
rcu_read_unlock();
}
@@ -2123,7 +2142,7 @@ static int ip_mc_add_src(struct in_devic
static void ip_mc_clear_src(struct ip_mc_list *pmc)
{
- struct ip_sf_list *psf, *nextpsf, *tomb, *sources;
+ struct ip_sf_list *tomb, *sources;
spin_lock_bh(&pmc->lock);
tomb = pmc->tomb;
@@ -2135,14 +2154,8 @@ static void ip_mc_clear_src(struct ip_mc
pmc->sfcount[MCAST_EXCLUDE] = 1;
spin_unlock_bh(&pmc->lock);
- for (psf = tomb; psf; psf = nextpsf) {
- nextpsf = psf->sf_next;
- kfree(psf);
- }
- for (psf = sources; psf; psf = nextpsf) {
- nextpsf = psf->sf_next;
- kfree(psf);
- }
+ ip_sf_list_clear_all(tomb);
+ ip_sf_list_clear_all(sources);
}
/* Join a multicast group
next prev parent reply other threads:[~2019-06-03 9:14 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-06-03 9:08 [PATCH 5.1 00/40] 5.1.7-stable review Greg Kroah-Hartman
2019-06-03 9:08 ` [PATCH 5.1 01/40] bonding/802.3ad: fix slave link initialization transition states Greg Kroah-Hartman
2019-06-03 9:08 ` [PATCH 5.1 02/40] cxgb4: offload VLAN flows regardless of VLAN ethtype Greg Kroah-Hartman
2019-06-03 9:08 ` [PATCH 5.1 03/40] ethtool: Check for vlan etype or vlan tci when parsing flow_rule Greg Kroah-Hartman
2019-06-03 9:08 ` [PATCH 5.1 04/40] inet: switch IP ID generator to siphash Greg Kroah-Hartman
2019-06-03 9:08 ` Greg Kroah-Hartman [this message]
2019-06-03 9:08 ` [PATCH 5.1 06/40] ipv4/igmp: fix build error if !CONFIG_IP_MULTICAST Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 07/40] ipv6: Consider sk_bound_dev_if when binding a raw socket to an address Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 08/40] ipv6: Fix redirect with VRF Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 09/40] llc: fix skb leak in llc_build_and_send_ui_pkt() Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 10/40] mlxsw: spectrum_acl: Avoid warning after identical rules insertion Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 11/40] net: dsa: mv88e6xxx: fix handling of upper half of STATS_TYPE_PORT Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 12/40] net: fec: fix the clk mismatch in failed_reset path Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 13/40] net-gro: fix use-after-free read in napi_gro_frags() Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 14/40] net: mvneta: Fix err code path of probe Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 15/40] net: mvpp2: fix bad MVPP2_TXQ_SCHED_TOKEN_CNTR_REG queue value Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 16/40] net: phy: marvell10g: report if the PHY fails to boot firmware Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 17/40] net: sched: dont use tc_action->order during action dump Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 18/40] net: stmmac: fix reset gpio free missing Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 19/40] r8169: fix MAC address being lost in PCI D3 Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 20/40] usbnet: fix kernel crash after disconnect Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 21/40] net/mlx5: Avoid double free in fs init error unwinding path Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 22/40] tipc: Avoid copying bytes beyond the supplied data Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 23/40] net/mlx5: Allocate root ns memory using kzalloc to match kfree Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 24/40] net/mlx5e: Disable rxhash when CQE compress is enabled Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 26/40] net: stmmac: dma channel control register need to be init first Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 27/40] bnxt_en: Fix aggregation buffer leak under OOM condition Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 28/40] bnxt_en: Fix possible BUG() condition when calling pci_disable_msix() Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 29/40] bnxt_en: Reduce memory usage when running in kdump kernel Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 30/40] net/tls: fix lowat calculation if some data came from previous record Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 31/40] selftests/tls: test for lowat overshoot with multiple records Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 32/40] net/tls: fix no wakeup on partial reads Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 33/40] selftests/tls: add test for sleeping even though there is data Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 34/40] net/tls: fix state removal with feature flags off Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 35/40] net/tls: dont ignore netdev notifications if no TLS features Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 36/40] cxgb4: Revert "cxgb4: Remove SGE_HOST_PAGE_SIZE dependency on page size" Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 37/40] net: correct zerocopy refcnt with udp MSG_MORE Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 38/40] crypto: vmx - ghash: do nosimd fallback manually Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 39/40] Revert "tipc: fix modprobe tipc failed after switch order of device registration" Greg Kroah-Hartman
2019-06-03 9:09 ` [PATCH 5.1 40/40] tipc: fix modprobe tipc failed after switch order of device registration Greg Kroah-Hartman
2019-06-03 14:49 ` [PATCH 5.1 00/40] 5.1.7-stable review kernelci.org bot
2019-06-03 18:28 ` Kevin Hilman
2019-06-04 5:49 ` Greg Kroah-Hartman
2019-06-03 17:17 ` Guenter Roeck
2019-06-04 5:51 ` Greg Kroah-Hartman
2019-06-03 18:34 ` Jon Hunter
2019-06-03 18:34 ` Jon Hunter
2019-06-04 5:50 ` Greg Kroah-Hartman
2019-06-03 19:33 ` Naresh Kamboju
2019-06-04 5:51 ` Greg Kroah-Hartman
2019-06-03 23:31 ` shuah
2019-06-04 5:50 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190603090522.960391894@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=liuhangbin@gmail.com \
--cc=stable@vger.kernel.org \
--cc=syzkaller@googlegroups.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.