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,
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to