svn commit: r311289 - stable/11/usr.sbin/rtadvd

Fabien Thomas fabient at FreeBSD.org
Wed Jan 4 16:36:52 UTC 2017


Author: fabient
Date: Wed Jan  4 16:36:51 2017
New Revision: 311289
URL: https://svnweb.freebsd.org/changeset/base/311289

Log:
  MFC r308216:
  
  In rtadvd, interface lookup calls if_indextoname() many times in a loop,
  (it takes a long time on systems with many interfaces)
  without reason and without checking its return value.
  
  Sponsored by: Stormshield

Modified:
  stable/11/usr.sbin/rtadvd/if.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/usr.sbin/rtadvd/if.c
==============================================================================
--- stable/11/usr.sbin/rtadvd/if.c	Wed Jan  4 16:24:40 2017	(r311288)
+++ stable/11/usr.sbin/rtadvd/if.c	Wed Jan  4 16:36:51 2017	(r311289)
@@ -474,11 +474,18 @@ update_ifinfo(struct ifilist_head_t *ifi
 			    ifindex != ifm->ifm_index)
 				continue;
 
+			/* ifname */
+			if (if_indextoname(ifm->ifm_index, ifname) == NULL) {
+				syslog(LOG_WARNING,
+				    "<%s> ifname not found (idx=%d)",
+				    __func__, ifm->ifm_index);
+				continue;
+			}
+
 			/* lookup an entry with the same ifindex */
 			TAILQ_FOREACH(ifi, ifi_head, ifi_next) {
 				if (ifm->ifm_index == ifi->ifi_ifindex)
 					break;
-				if_indextoname(ifm->ifm_index, ifname);
 				if (strncmp(ifname, ifi->ifi_ifname,
 					sizeof(ifname)) == 0)
 					break;
@@ -497,15 +504,7 @@ update_ifinfo(struct ifilist_head_t *ifi
 			ifi->ifi_ifindex = ifm->ifm_index;
 
 			/* ifname */
-			if_indextoname(ifm->ifm_index, ifi->ifi_ifname);
-			if (ifi->ifi_ifname == NULL) {
-				syslog(LOG_WARNING,
-				    "<%s> ifname not found (idx=%d)",
-				    __func__, ifm->ifm_index);
-				if (ifi_new)
-					free(ifi);
-				continue;
-			}
+			strlcpy(ifi->ifi_ifname, ifname, IFNAMSIZ);
 
 			if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
 				syslog(LOG_ERR,


More information about the svn-src-all mailing list