]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/commit
Fix ifa refcount leak in ifa_ifwithnet()
authorRyan Stone <rstone@FreeBSD.org>
Thu, 11 Feb 2021 16:17:58 +0000 (11:17 -0500)
committerRyan Stone <rstone@FreeBSD.org>
Thu, 6 Jan 2022 20:04:24 +0000 (15:04 -0500)
commit5adea417d494b9c0e186cf2d06f98873d02d1834
tree6c4a10726aef176f6319bbb8d64c3ac65b6c0945
parent32a95656b51ebefcdf3e0b02c110825f59abd26f
Fix ifa refcount leak in ifa_ifwithnet()

In 4f6c66cc9c75c8, ifa_ifwithnet() was changed to no longer
ifa_ref() the returned ifaddr, and instead the caller was required
to stay in the net_epoch for as long as they wanted the ifaddr
to remain valid.  However, this missed the case where an AF_LINK
lookup would call ifaddr_byindex(), which still does ifa_ref()
the ifaddr.  This would cause a refcount leak.

Fix this by inlining the relevant parts of ifaddr_byindex() here,
with the ifa_ref() call removed.  This also avoids an unnecessary
entry and exit from the net_epoch for this case.

I've audited all in-tree consumers of ifa_ifwithnet() that could
possibly perform an AF_LINK lookup and confirmed that none of them
will expect the ifaddr to have a reference that they need to
release.

MFC after: 2 months
Sponsored by: Dell Inc
Differential Revision: https://reviews.freebsd.org/D28705
Reviewed by: melifaro
sys/net/if.c