summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorajs <ajs>2005-04-02 22:50:38 +0000
committerajs <ajs>2005-04-02 22:50:38 +0000
commita349198fd3e4e5692cdc91223f8153cb53c086ce (patch)
treee5b366a8ab7ab9ed1c9670faf1f18eef26877ade /lib
parentf695b01ff8e9aebc46bdf41f104ad4abbb0ef59e (diff)
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.
Diffstat (limited to 'lib')
-rw-r--r--lib/ChangeLog10
-rw-r--r--lib/if.c42
-rw-r--r--lib/if.h16
-rw-r--r--lib/zclient.c11
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.
diff --git a/lib/if.c b/lib/if.c
index e35e3ed2..212b236c 100644
--- a/lib/if.c
+++ b/lib/if.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;
diff --git a/lib/if.h b/lib/if.h
index df9ff605..4cfc9e77 100644
--- a/lib/if.h
+++ b/lib/if.h
@@ -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)