From 08dbfb691d8e03c7200138d55447fc29916e0362 Mon Sep 17 00:00:00 2001 From: ajs Date: Sun, 3 Apr 2005 03:40:52 +0000 Subject: 2005-04-02 Andrew J. Schorr * if_ioctl.c: (interface_list_ioctl) Use if_get_by_name_len. * if_proc.c: (ifaddr_proc_ipv6) Increase size of ifname buffer to avoid overflow. * kernel_socket.c: (ifan_read) Use if_get_by_name_len. * if.h: Fix comments to reflect that if_lookup_by_name and if_get_by_name now require the argument strings to be NUL-terminated. * if.c: (if_lookup_by_name) Compare using strcmp. (if_get_by_name) Pass strlen(ifname) as 2nd arg to if_create. --- lib/ChangeLog | 7 +++++++ lib/if.c | 8 ++------ lib/if.h | 23 ++++++++++------------- zebra/ChangeLog | 7 +++++++ zebra/if_ioctl.c | 8 ++++++-- zebra/if_proc.c | 2 +- zebra/kernel_socket.c | 4 +++- 7 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index f55578e6..6701a90d 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,10 @@ +2005-04-02 Andrew J. Schorr + + * if.h: Fix comments to reflect that if_lookup_by_name and + if_get_by_name now require the argument strings to be NUL-terminated. + * if.c: (if_lookup_by_name) Compare using strcmp. + (if_get_by_name) Pass strlen(ifname) as 2nd arg to if_create. + 2005-04-02 Andrew J. Schorr * if.c: (if_nametoindex) The man page is rather vague, but it seems diff --git a/lib/if.c b/lib/if.c index a32cee0e..dbf4f202 100644 --- a/lib/if.c +++ b/lib/if.c @@ -219,9 +219,7 @@ 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) + if (strcmp(name, ifp->name) == 0) return ifp; } return NULL; @@ -335,10 +333,8 @@ if_get_by_name (const char *name) { struct interface *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); + if_create(name, strlen(name)); } struct interface * diff --git a/lib/if.h b/lib/if.h index 4cfc9e77..6946865c 100644 --- a/lib/if.h +++ b/lib/if.h @@ -217,20 +217,17 @@ struct interface *if_lookup_by_index (unsigned int); 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, +/* These 2 functions are to be used when the ifname argument is terminated + by a '\0' character: */ +struct interface *if_lookup_by_name (const char *ifname); +struct interface *if_get_by_name (const char *ifname); + +/* For these 2 functions, the namelen argument should be the precise length + of the ifname string (not counting any optional trailing '\0' character). + In most cases, strnlen should be used to calculate the namelen value. */ +extern struct interface *if_lookup_by_name_len(const char *ifname, size_t namelen); -extern struct interface *if_get_by_name_len(const char *name, size_t namelen); +extern struct interface *if_get_by_name_len(const char *ifname, size_t namelen); /* Delete the interface, but do not free the structure, and leave it in the diff --git a/zebra/ChangeLog b/zebra/ChangeLog index 924f0f0a..1d0f1754 100644 --- a/zebra/ChangeLog +++ b/zebra/ChangeLog @@ -1,3 +1,10 @@ +2005-04-02 Andrew J. Schorr + + * if_ioctl.c: (interface_list_ioctl) Use if_get_by_name_len. + * if_proc.c: (ifaddr_proc_ipv6) Increase size of ifname buffer to + avoid overflow. + * kernel_socket.c: (ifan_read) Use if_get_by_name_len. + 2005-04-02 Andrew J. Schorr * kernel_socket.c: (ifm_read) Use new if_lookup_by_name_len function diff --git a/zebra/if_ioctl.c b/zebra/if_ioctl.c index 90f18e28..0d7713db 100644 --- a/zebra/if_ioctl.c +++ b/zebra/if_ioctl.c @@ -102,7 +102,9 @@ interface_list_ioctl () int size; ifreq = (struct ifreq *)((caddr_t) ifconf.ifc_req + n); - ifp = if_get_by_name (ifreq->ifr_name); + ifp = if_get_by_name_len(ifreq->ifr_name, + strnlen(ifreq->ifr_name, + sizeof(ifreq->ifr_name))); if_add_update (ifp); size = ifreq->ifr_addr.sa_len; if (size < sizeof (ifreq->ifr_addr)) @@ -113,7 +115,9 @@ interface_list_ioctl () #else for (n = 0; n < ifconf.ifc_len; n += sizeof(struct ifreq)) { - ifp = if_get_by_name (ifreq->ifr_name); + ifp = if_get_by_name_len(ifreq->ifr_name, + strnlen(ifreq->ifr_name, + sizeof(ifreq->ifr_name))); if_add_update (ifp); ifreq++; } diff --git a/zebra/if_proc.c b/zebra/if_proc.c index 504d2f3c..3257d03c 100644 --- a/zebra/if_proc.c +++ b/zebra/if_proc.c @@ -212,7 +212,7 @@ ifaddr_proc_ipv6 () char buf[PROCBUFSIZ]; int n; char addr[33]; - char ifname[20]; + char ifname[21]; int ifindex, plen, scope, status; struct interface *ifp; struct prefix_ipv6 p; diff --git a/zebra/kernel_socket.c b/zebra/kernel_socket.c index 12125630..c1f785d4 100644 --- a/zebra/kernel_socket.c +++ b/zebra/kernel_socket.c @@ -201,7 +201,9 @@ ifan_read (struct if_announcemsghdr *ifan) if (ifp == NULL && ifan->ifan_what == IFAN_ARRIVAL) { /* Create Interface */ - ifp = if_get_by_name (ifan->ifan_name); + ifp = if_get_by_name_len(ifan->ifan_name, + strnlen(ifan->ifan_name, + sizeof(ifan->ifan_name))); ifp->ifindex = ifan->ifan_index; if_add_update (ifp); -- cgit v1.2.1