diff options
| author | Donald Sharp <sharpd@cumulusnetworks.com> | 2021-02-19 08:54:02 -0500 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-02-19 08:54:02 -0500 | 
| commit | dc86ef74e68d575f4beec0197177e90dfb42c643 (patch) | |
| tree | c7400ef7a5fa4285b39b339da0046439c7f37b77 | |
| parent | ba877ace256d58e1ffdbaf058287848f43680cbf (diff) | |
| parent | 5a224c19f195c03275011b0b642b844182485334 (diff) | |
Merge pull request #8079 from pjdruddy/pr-snmp-coverity
MPLSL3VPN snmp coverity fixes
| -rw-r--r-- | bgpd/bgp_mplsvpn_snmp.c | 15 | ||||
| -rw-r--r-- | lib/smux.h | 1 | ||||
| -rw-r--r-- | lib/snmp.c | 11 | 
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;  | 
