summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfdd/ptm_adapter.c4
-rw-r--r--isisd/isis_bfd.c6
-rw-r--r--lib/bfd.c22
-rw-r--r--ospfd/ospf_bfd.c6
-rw-r--r--pimd/pim_bfd.c6
5 files changed, 28 insertions, 16 deletions
diff --git a/bfdd/ptm_adapter.c b/bfdd/ptm_adapter.c
index db636c9191..0c70600f20 100644
--- a/bfdd/ptm_adapter.c
+++ b/bfdd/ptm_adapter.c
@@ -703,8 +703,10 @@ static void bfdd_sessions_disable_interface(struct interface *ifp)
TAILQ_FOREACH(bso, &bglobal.bg_obslist, bso_entry) {
bs = bso->bso_bs;
- if (strcmp(ifp->name, bs->key.ifname))
+
+ if (bs->ifp != ifp)
continue;
+
/* Skip disabled sessions. */
if (bs->sock == -1) {
bs->ifp = NULL;
diff --git a/isisd/isis_bfd.c b/isisd/isis_bfd.c
index e74af4da21..4fac73511b 100644
--- a/isisd/isis_bfd.c
+++ b/isisd/isis_bfd.c
@@ -146,11 +146,11 @@ static void bfd_adj_event(struct isis_adjacency *adj, struct prefix *dst,
static int isis_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp;
- struct prefix dst_ip;
+ struct prefix dst_ip, src_ip;
int status;
- ifp = bfd_get_peer_info(zclient->ibuf, &dst_ip, NULL, &status,
- NULL, vrf_id);
+ ifp = bfd_get_peer_info(zclient->ibuf, &dst_ip, &src_ip, &status, NULL,
+ vrf_id);
if (!ifp || (dst_ip.family != AF_INET && dst_ip.family != AF_INET6))
return 0;
diff --git a/lib/bfd.c b/lib/bfd.c
index cdf7008601..3ab0e21af5 100644
--- a/lib/bfd.c
+++ b/lib/bfd.c
@@ -224,6 +224,17 @@ struct interface *bfd_get_peer_info(struct stream *s, struct prefix *dp,
int plen;
int local_remote_cbit;
+ /*
+ * If the ifindex lookup fails the
+ * rest of the data in the stream is
+ * not read. All examples of this function
+ * call immediately use the dp->family which
+ * is not good. Ensure we are not using
+ * random data
+ */
+ memset(dp, 0, sizeof(*dp));
+ memset(sp, 0, sizeof(*sp));
+
/* Get interface index. */
ifindex = stream_getl(s);
@@ -249,13 +260,12 @@ struct interface *bfd_get_peer_info(struct stream *s, struct prefix *dp,
/* Get BFD status. */
*status = stream_getl(s);
- if (sp) {
- sp->family = stream_getc(s);
+ sp->family = stream_getc(s);
+
+ plen = prefix_blen(sp);
+ stream_get(&sp->u.prefix, s, plen);
+ sp->prefixlen = stream_getc(s);
- plen = prefix_blen(sp);
- stream_get(&sp->u.prefix, s, plen);
- sp->prefixlen = stream_getc(s);
- }
local_remote_cbit = stream_getc(s);
if (remote_cbit)
*remote_cbit = local_remote_cbit;
diff --git a/ospfd/ospf_bfd.c b/ospfd/ospf_bfd.c
index 4640720952..a9bc9069d2 100644
--- a/ospfd/ospf_bfd.c
+++ b/ospfd/ospf_bfd.c
@@ -205,14 +205,14 @@ static int ospf_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
struct ospf_neighbor *nbr = NULL;
struct route_node *node;
struct route_node *n_node;
- struct prefix p;
+ struct prefix p, src_p;
int status;
int old_status;
struct bfd_info *bfd_info;
struct timeval tv;
- ifp = bfd_get_peer_info(zclient->ibuf, &p, NULL, &status,
- NULL, vrf_id);
+ ifp = bfd_get_peer_info(zclient->ibuf, &p, &src_p, &status, NULL,
+ vrf_id);
if ((ifp == NULL) || (p.family != AF_INET))
return 0;
diff --git a/pimd/pim_bfd.c b/pimd/pim_bfd.c
index 1d653cdc3f..5e1b9a69e1 100644
--- a/pimd/pim_bfd.c
+++ b/pimd/pim_bfd.c
@@ -217,7 +217,7 @@ static int pim_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
{
struct interface *ifp = NULL;
struct pim_interface *pim_ifp = NULL;
- struct prefix p;
+ struct prefix p, src_p;
int status;
char msg[100];
int old_status;
@@ -227,8 +227,8 @@ static int pim_bfd_interface_dest_update(ZAPI_CALLBACK_ARGS)
struct listnode *neigh_nextnode = NULL;
struct pim_neighbor *neigh = NULL;
- ifp = bfd_get_peer_info(zclient->ibuf, &p, NULL, &status,
- NULL, vrf_id);
+ ifp = bfd_get_peer_info(zclient->ibuf, &p, &src_p, &status, NULL,
+ vrf_id);
if ((ifp == NULL) || (p.family != AF_INET))
return 0;