svn commit: r356268 - head/sys/net

Alexander V. Chernikov melifaro at FreeBSD.org
Thu Jan 2 09:08:46 UTC 2020


Author: melifaro
Date: Thu Jan  2 09:08:45 2020
New Revision: 356268
URL: https://svnweb.freebsd.org/changeset/base/356268

Log:
  Plug loopback idaddr refcount leak.
  
  Reviewed by:	markj
  MFC after:	2 weeks
  Differential Revision:	https://reviews.freebsd.org/D22980

Modified:
  head/sys/net/if.c

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c	Thu Jan  2 06:56:28 2020	(r356267)
+++ head/sys/net/if.c	Thu Jan  2 09:08:45 2020	(r356268)
@@ -1836,6 +1836,7 @@ ifa_maintain_loopback_route(int cmd, const char *otype
 	struct rt_addrinfo info;
 	struct sockaddr_dl null_sdl;
 	struct ifnet *ifp;
+	struct ifaddr *rti_ifa = NULL;
 
 	ifp = ifa->ifa_ifp;
 
@@ -1846,9 +1847,10 @@ ifa_maintain_loopback_route(int cmd, const char *otype
 		/* explicitly specify (loopback) ifa */
 		if (info.rti_ifp != NULL) {
 			NET_EPOCH_ENTER(et);
-			info.rti_ifa = ifaof_ifpforaddr(ifa->ifa_addr, info.rti_ifp);
-			if (info.rti_ifa != NULL)
-				ifa_ref(info.rti_ifa);
+			rti_ifa = ifaof_ifpforaddr(ifa->ifa_addr, info.rti_ifp);
+			if (rti_ifa != NULL)
+				ifa_ref(rti_ifa);
+			info.rti_ifa = rti_ifa;
 			NET_EPOCH_EXIT(et);
 		}
 	}
@@ -1858,6 +1860,9 @@ ifa_maintain_loopback_route(int cmd, const char *otype
 	link_init_sdl(ifp, (struct sockaddr *)&null_sdl, ifp->if_type);
 
 	error = rtrequest1_fib(cmd, &info, NULL, ifp->if_fib);
+
+	if (rti_ifa != NULL)
+		ifa_free(rti_ifa);
 
 	if (error != 0 &&
 	    !(cmd == RTM_ADD && error == EEXIST) &&


More information about the svn-src-all mailing list