svn commit: r308216 - head/usr.sbin/rtadvd

Fabien Thomas fabient at FreeBSD.org
Wed Nov 2 15:11:25 UTC 2016


Author: fabient
Date: Wed Nov  2 15:11:23 2016
New Revision: 308216
URL: https://svnweb.freebsd.org/changeset/base/308216

Log:
  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.
  
  Reviewed by: cem
  Obtained from: Maryse Levavasseur <maryse.levavasseur at stormshield.eu>
  MFC after: 1 month
  Sponsored by: Stormshield
  Differential Revision: https://reviews.freebsd.org/D6979

Modified:
  head/usr.sbin/rtadvd/if.c

Modified: head/usr.sbin/rtadvd/if.c
==============================================================================
--- head/usr.sbin/rtadvd/if.c	Wed Nov  2 14:25:30 2016	(r308215)
+++ head/usr.sbin/rtadvd/if.c	Wed Nov  2 15:11:23 2016	(r308216)
@@ -470,11 +470,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;
@@ -493,15 +500,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