2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu>

	* if.h: (if_lookup_by_name_len, if_get_by_name_len) New functions.
	* if.c: (if_lookup_by_name_len, if_get_by_name_len) New functions.
	  (if_get_by_name) Tighten up code.
	  (interface) Use new function if_get_by_name_len.
	* zclient.c: (zebra_interface_add_read) Use new if_get_by_name_len
	  function.
	  (zebra_interface_state_read) Use new if_lookup_by_name_len function.
	* kernel_socket.c: (ifm_read) Use new if_lookup_by_name_len function
	  to save a memcpy.
	* if_ioctl_solaris.c: (interface_list_ioctl) Fix subtle bug with new
	  if_get_by_name_len function.
	* ospf_interface.c: (ospf_vl_new) Use strnlen to fix call to if_create.
diff --git a/zebra/ChangeLog b/zebra/ChangeLog
index 572d268..924f0f0 100644
--- a/zebra/ChangeLog
+++ b/zebra/ChangeLog
@@ -1,5 +1,12 @@
 2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
 
+	* kernel_socket.c: (ifm_read) Use new if_lookup_by_name_len function
+	  to save a memcpy.
+	* if_ioctl_solaris.c: (interface_list_ioctl) Fix subtle bug with new
+	  if_get_by_name_len function.
+
+2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu>
+
 	* interface.c: (if_new_intern_ifindex) Remove obsolete function.
 	  (if_delete_update) After distributing the interface deletion message,
 	  set ifp->ifindex to IFINDEX_INTERNAL.
diff --git a/zebra/if_ioctl_solaris.c b/zebra/if_ioctl_solaris.c
index 38ac5a7..aa01b07 100644
--- a/zebra/if_ioctl_solaris.c
+++ b/zebra/if_ioctl_solaris.c
@@ -138,7 +138,9 @@
 
   for (n = 0; n < lifconf.lifc_len; n += sizeof (struct lifreq))
     {
-      ifp = if_get_by_name (lifreq->lifr_name);
+      ifp = if_get_by_name_len(lifreq->lifr_name,
+			       strnlen(lifreq->lifr_name,
+				       sizeof(lifreq->lifr_name)));
 
       if (lifreq->lifr_addr.ss_family == AF_INET)
         ifp->flags |= IFF_IPV4;
diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c
index cdc6822..1212563 100644
--- a/zebra/kernel_socket.c
+++ b/zebra/kernel_socket.c
@@ -235,7 +235,6 @@
   struct sockaddr_dl *sdl = NULL;
   void *cp;
   unsigned int i;
-  char ifname[IFNAMSIZ];
 
   /* paranoia: sanity check structure */
   if (ifm->ifm_msglen < sizeof(struct if_msghdr))
@@ -309,6 +308,9 @@
       /*
        * paranoia: sanity check name length.  nlen does not include
        * trailing zero, but IFNAMSIZ max length does.
+       *
+       * XXX Is this test correct?  Should it be '>=' or '>'?  And is it even
+       * necessary now that we are using if_lookup_by_name_len?
        */
       if (sdl->sdl_nlen >= IFNAMSIZ)
 	{
@@ -316,9 +318,7 @@
 	  return -1;
 	}
 
-      memcpy (ifname, sdl->sdl_data, sdl->sdl_nlen);
-      ifname[sdl->sdl_nlen] = '\0';
-      ifp = if_lookup_by_name (ifname);
+      ifp = if_lookup_by_name_len (sdl->sdl_data, sdl->sdl_nlen);
     }
 
   /*