diff options
Diffstat (limited to 'lib')
-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 |
4 files changed, 64 insertions, 15 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) |