diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-02-18 11:59:58 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2021-02-18 12:06:46 +0100 |
commit | a973c5922de7ada4ff4d4b459d4f5b28d2aeb9e0 (patch) | |
tree | 3b92c50e48b4f3621638fd63b4e2b2d6fa5136cf | |
parent | 26ae658a83eeca16780cf5615c8247cbb151c3fa (diff) | |
download | slirp-ndp-leak.zip slirp-ndp-leak.tar.gz slirp-ndp-leak.tar.bz2 |
ip6_output: fix memory leak on fast-sendndp-leak
When emitting NDP Neighbour Sollicitations, ip6_output immediately calls
if_encap without going through any queue. if_encap however does not free
the mbuf, so ip6_output has to do it.
This was leaking one mbuf per NDP NS sent by slirp. Hopefully the guest was
not using more than NDP_TABLE_SIZE (16) IPv6 addresses, in which case it was
limited to a bound number, but more addresses would result to leaks.
-rw-r--r-- | src/ip6_output.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/src/ip6_output.c b/src/ip6_output.c index b861106..2f62cc9 100644 --- a/src/ip6_output.c +++ b/src/ip6_output.c @@ -30,7 +30,10 @@ int ip6_output(struct socket *so, struct mbuf *m, int fast) ip->ip_fl_lo = 0; if (fast) { + /* We cannot fast-send non-multicast, we'd need a NDP NS */ + assert(IN6_IS_ADDR_MULTICAST(&ip->ip_dst)); if_encap(m->slirp, m); + m_free(m); } else { if_output(so, m); } |