diff options
-rw-r--r-- | lib/ChangeLog | 10 | ||||
-rw-r--r-- | lib/if.c | 42 | ||||
-rw-r--r-- | lib/if.h | 16 | ||||
-rw-r--r-- | lib/zclient.c | 11 | ||||
-rw-r--r-- | ospfd/ChangeLog | 4 | ||||
-rw-r--r-- | ospfd/ospf_interface.c | 4 | ||||
-rw-r--r-- | zebra/ChangeLog | 7 | ||||
-rw-r--r-- | zebra/if_ioctl_solaris.c | 4 | ||||
-rw-r--r-- | zebra/kernel_socket.c | 8 |
9 files changed, 84 insertions, 22 deletions
diff --git a/lib/ChangeLog b/lib/ChangeLog index c372e66c..35910a65 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,5 +1,15 @@ 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. + +2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + * str.c: Replace strlcpy and strlcat with actual working versions copied from rsync-2.6.2/lib/compat.c. @@ -219,12 +219,33 @@ if_lookup_by_name (const char *name) for (node = listhead (iflist); node; nextnode (node)) { ifp = getdata (node); + /* Change this to strcmp once improper uses of this function + have been replaced with calls to if_lookup_by_name_len. */ if (strncmp (name, ifp->name, sizeof ifp->name) == 0) return ifp; } return NULL; } +struct interface * +if_lookup_by_name_len(const char *name, size_t namelen) +{ + struct listnode *node; + + if (namelen > INTERFACE_NAMSIZ) + return NULL; + + for (node = listhead (iflist); node; nextnode (node)) + { + struct interface *ifp; + + ifp = getdata (node); + if (!memcmp(name, ifp->name, namelen) && (ifp->name[namelen] == '\0')) + return ifp; + } + return NULL; +} + /* Lookup interface by IPv4 address. */ struct interface * if_lookup_exact_address (struct in_addr src) @@ -314,10 +335,19 @@ if_get_by_name (const char *name) { struct interface *ifp; - ifp = if_lookup_by_name (name); - if (ifp == NULL) - ifp = if_create (name, INTERFACE_NAMSIZ); - return ifp; + /* Replace 2nd arg to if_create with strlen(name) once improper uses of + this function have been replaced with calls to if_get_by_name_len. */ + return ((ifp = if_lookup_by_name(name)) != NULL) ? ifp : + if_create(name, INTERFACE_NAMSIZ); +} + +struct interface * +if_get_by_name_len(const char *name, size_t namelen) +{ + struct interface *ifp; + + return ((ifp = if_lookup_by_name_len(name, namelen)) != NULL) ? ifp : + if_create(name, namelen); } /* Does interface up ? */ @@ -504,10 +534,8 @@ DEFUN (interface, return CMD_WARNING; } - ifp = if_lookup_by_name (argv[0]); + ifp = if_get_by_name_len(argv[0], sl); - if (ifp == NULL) - ifp = if_create (argv[0], sl); vty->index = ifp; vty->node = INTERFACE_NODE; @@ -214,11 +214,25 @@ struct connected int if_cmp_func (struct interface *, struct interface *); struct interface *if_create (const char *name, int namelen); struct interface *if_lookup_by_index (unsigned int); -struct interface *if_lookup_by_name (const char *); struct interface *if_lookup_exact_address (struct in_addr); struct interface *if_lookup_address (struct in_addr); + +/* Currently, the code assumes that the interface name arguments to these + functions have length <= INTERFACE_NAMSIZ, and they must be NUL-terminated + if they are shorter than INTERFACE_NAMSIZ. After code cleanup, the + implementation will be changed to require the arguments to these functions + to terminate with a NUL character (no length limitation). */ +struct interface *if_lookup_by_name (const char *); struct interface *if_get_by_name (const char *); +/* For these 2 functions, the 2nd argument should be the precise length + of the interface name (not counting a trailing NUL which may or may + not be present). */ +extern struct interface *if_lookup_by_name_len(const char *name, + size_t namelen); +extern struct interface *if_get_by_name_len(const char *name, size_t namelen); + + /* Delete the interface, but do not free the structure, and leave it in the interface list. It is often advisable to leave the pseudo interface structure because there may be configuration information attached. */ diff --git a/lib/zclient.c b/lib/zclient.c index 453e6cdd..efcad57f 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -534,12 +534,8 @@ zebra_interface_add_read (struct stream *s) /* Read interface name. */ stream_get (ifname_tmp, s, INTERFACE_NAMSIZ); - /* Lookup this by interface name. */ - ifp = if_lookup_by_name (ifname_tmp); - - /* If such interface does not exist, make new one. */ - if (! ifp) - ifp = if_create (ifname_tmp, INTERFACE_NAMSIZ); + /* Lookup/create interface by name. */ + ifp = if_get_by_name_len (ifname_tmp, strnlen(ifname_tmp, INTERFACE_NAMSIZ)); /* Read interface's index. */ ifp->ifindex = stream_getl (s); @@ -579,7 +575,8 @@ zebra_interface_state_read (struct stream *s) stream_get (ifname_tmp, s, INTERFACE_NAMSIZ); /* Lookup this by interface index. */ - ifp = if_lookup_by_name (ifname_tmp); + ifp = if_lookup_by_name_len (ifname_tmp, + strnlen(ifname_tmp, INTERFACE_NAMSIZ)); /* If such interface does not exist, indicate an error */ if (! ifp) diff --git a/ospfd/ChangeLog b/ospfd/ChangeLog index b1d6bbec..e8eae90e 100644 --- a/ospfd/ChangeLog +++ b/ospfd/ChangeLog @@ -1,5 +1,9 @@ 2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + * ospf_interface.c: (ospf_vl_new) Use strnlen to fix call to if_create. + +2005-04-02 Andrew J. Schorr <ajschorr@alumni.princeton.edu> + * ospf_vty.c: (show_ip_ospf_interface_sub) Show ifindex and interface flags to help with debugging. * ospf_zebra.c: (ospf_interface_delete) After deleting, set ifp->ifindex diff --git a/ospfd/ospf_interface.c b/ospfd/ospf_interface.c index b76abe58..027dfb9d 100644 --- a/ospfd/ospf_interface.c +++ b/ospfd/ospf_interface.c @@ -880,8 +880,8 @@ ospf_vl_new (struct ospf *ospf, struct ospf_vl_data *vl_data) if (IS_DEBUG_OSPF_EVENT) zlog_debug ("ospf_vl_new(): creating pseudo zebra interface"); - snprintf (ifname, INTERFACE_NAMSIZ + 1, "VLINK%d", vlink_count); - vi = if_create (ifname, INTERFACE_NAMSIZ); + snprintf (ifname, sizeof(ifname), "VLINK%d", vlink_count); + vi = if_create (ifname, strnlen(ifname, sizeof(ifname))); co = connected_new (); co->ifp = vi; listnode_add (vi->connected, co); diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 572d2687..924f0f0a 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 38ac5a71..aa01b073 100644 --- a/zebra/if_ioctl_solaris.c +++ b/zebra/if_ioctl_solaris.c @@ -138,7 +138,9 @@ calculate_lifc_len: /* must hold privileges to enter here */ 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 cdc6822c..12125630 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -235,7 +235,6 @@ ifm_read (struct if_msghdr *ifm) 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 @@ ifm_read (struct if_msghdr *ifm) /* * 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 @@ ifm_read (struct if_msghdr *ifm) 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); } /* |