summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <sharpd@cumulusnetworks.com>2021-02-19 08:54:02 -0500
committerGitHub <noreply@github.com>2021-02-19 08:54:02 -0500
commitdc86ef74e68d575f4beec0197177e90dfb42c643 (patch)
treec7400ef7a5fa4285b39b339da0046439c7f37b77
parentba877ace256d58e1ffdbaf058287848f43680cbf (diff)
parent5a224c19f195c03275011b0b642b844182485334 (diff)
Merge pull request #8079 from pjdruddy/pr-snmp-coverity
MPLSL3VPN snmp coverity fixes
-rw-r--r--bgpd/bgp_mplsvpn_snmp.c15
-rw-r--r--lib/smux.h1
-rw-r--r--lib/snmp.c11
3 files changed, 20 insertions, 7 deletions
diff --git a/bgpd/bgp_mplsvpn_snmp.c b/bgpd/bgp_mplsvpn_snmp.c
index 055bae8432..b74cf37ac7 100644
--- a/bgpd/bgp_mplsvpn_snmp.c
+++ b/bgpd/bgp_mplsvpn_snmp.c
@@ -1023,14 +1023,17 @@ static struct bgp *bgpL3vpnVrfRt_lookup(struct variable *v, oid name[],
*rt_type = name[namelen + vrf_name_len + sizeof(uint32_t)];
}
+ /* validate the RT index is in range */
+ if (*rt_index > AFI_IP6)
+ return NULL;
+
if (exact) {
l3vpn_bgp = bgp_lookup_by_name(vrf_name);
if (l3vpn_bgp && !is_bgp_vrf_mplsvpn(l3vpn_bgp))
return NULL;
if (!l3vpn_bgp)
return NULL;
- /* check the index and type match up */
- if ((*rt_index != AFI_IP) || (*rt_index != AFI_IP6))
+ if ((*rt_index != AFI_IP) && (*rt_index != AFI_IP6))
return NULL;
/* do we have RT config */
if (!(l3vpn_bgp->vpn_policy[*rt_index]
@@ -1408,8 +1411,7 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
break;
case INETADDRESSTYPEIPV6:
prefix.family = AF_INET6;
- oid2in_addr(&name[i], sizeof(struct in6_addr),
- &prefix.u.prefix4); /* sic */
+ oid2in6_addr(&name[i], &prefix.u.prefix6);
i += sizeof(struct in6_addr);
break;
}
@@ -1431,8 +1433,7 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
break;
case INETADDRESSTYPEIPV6:
nexthop.ipa_type = IPADDR_V6;
- oid2in_addr(&name[i], sizeof(struct in6_addr),
- &nexthop.ip._v4_addr); /* sic */
+ oid2in6_addr(&name[i], &nexthop.ip._v6_addr);
/* i += sizeof(struct in6_addr); */
break;
}
@@ -1458,7 +1459,7 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
/* otherwise lookup the one we have */
*l3vpn_bgp = bgp_lookup_by_name(vrf_name);
- if (l3vpn_bgp == NULL)
+ if (*l3vpn_bgp == NULL)
return NULL;
pi = bgp_lookup_route_next(l3vpn_bgp, dest, &prefix, policy,
diff --git a/lib/smux.h b/lib/smux.h
index e07df2369f..11c1becd60 100644
--- a/lib/smux.h
+++ b/lib/smux.h
@@ -143,6 +143,7 @@ extern int smux_trap_multi_index(struct variable *vp, size_t vp_len,
size_t trapobjlen, uint8_t sptrap);
extern int oid_compare(const oid *, int, const oid *, int);
extern void oid2in_addr(oid[], int, struct in_addr *);
+extern void oid2in6_addr(oid oid[], struct in6_addr *addr);
extern void oid2int(oid oid[], int *dest);
extern void *oid_copy(void *, const void *, size_t);
extern void oid_copy_addr(oid[], const struct in_addr *, int);
diff --git a/lib/snmp.c b/lib/snmp.c
index e92f622bb9..17a4ed4a1d 100644
--- a/lib/snmp.c
+++ b/lib/snmp.c
@@ -64,6 +64,17 @@ void oid2in_addr(oid oid[], int len, struct in_addr *addr)
*pnt++ = oid[i];
}
+void oid2in6_addr(oid oid[], struct in6_addr *addr)
+{
+ unsigned int i;
+ uint8_t *pnt;
+
+ pnt = (uint8_t *)addr;
+
+ for (i = 0; i < sizeof(struct in6_addr); i++)
+ *pnt++ = oid[i];
+}
+
void oid2int(oid oid[], int *dest)
{
uint8_t i;