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

Reply via email to