]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib, bgpd: add a specific oid_copy function for IPv6 addrs
authorPat Ruddy <pat@voltanet.io>
Thu, 25 Mar 2021 14:39:07 +0000 (14:39 +0000)
committerPat Ruddy <pat@voltanet.io>
Thu, 25 Mar 2021 15:24:50 +0000 (15:24 +0000)
Do not overload the v4 oid_copy_addr function for ipv6
coverity does not like this kind of thing.

Signed-off-by: Pat Ruddy <pat@voltanet.io>
bgpd/bgp_mplsvpn_snmp.c
bgpd/bgp_snmp.c
eigrpd/eigrp_snmp.c
ldpd/ldp_snmp.c
lib/smux.h
lib/snmp.c
ospfd/ospf_snmp.c
ripd/rip_snmp.c

index b74cf37ac7c4c3bcce5514edb3b145e45bdce9b4..6f75856d543144bfec4438e341914d6dce23823b 100644 (file)
@@ -1478,10 +1478,16 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
                        oid_copy_str(&name[namelen], (*l3vpn_bgp)->name,
                                     vrf_name_len);
                        oid_index = namelen + vrf_name_len;
-                       name[oid_index++] =
-                               v4 ? INETADDRESSTYPEIPV4 : INETADDRESSTYPEIPV6;
-                       oid_copy_addr(&name[oid_index], &p->u.prefix4,
-                                     addr_len);
+                       if (v4) {
+                               name[oid_index++] = INETADDRESSTYPEIPV4;
+                               oid_copy_in_addr(&name[oid_index],
+                                                &p->u.prefix4);
+                       } else {
+                               name[oid_index++] = INETADDRESSTYPEIPV6;
+                               oid_copy_in6_addr(&name[oid_index],
+                                                 &p->u.prefix6);
+                       }
+
                        oid_index += addr_len;
                        name[oid_index++] = p->prefixlen;
                        name[oid_index++] = *policy >> 8;
@@ -1493,9 +1499,8 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
                                                INETADDRESSTYPEUNKNOWN;
                                else {
                                        name[oid_index++] = INETADDRESSTYPEIPV4;
-                                       oid_copy_addr(&name[oid_index],
-                                                     &attr->nexthop,
-                                                     sizeof(struct in_addr));
+                                       oid_copy_in_addr(&name[oid_index],
+                                                        &attr->nexthop);
                                        oid_index += sizeof(struct in_addr);
                                }
                        } else {
@@ -1505,11 +1510,9 @@ static struct bgp_path_info *bgpL3vpnRte_lookup(struct variable *v, oid name[],
                                                INETADDRESSTYPEUNKNOWN;
                                else {
                                        name[oid_index++] = INETADDRESSTYPEIPV6;
-                                       oid_copy_addr(
+                                       oid_copy_in6_addr(
                                                &name[oid_index],
-                                               (struct in_addr *)&attr
-                                                       ->mp_nexthop_global,
-                                               sizeof(struct in6_addr));
+                                               &attr->mp_nexthop_global);
                                        oid_index += sizeof(struct in6_addr);
                                }
                        }
index bc26314b50cb72a2e77363210c90b89b181f3853..3afdbea908ba61a6534eb729844e616088796302 100644 (file)
@@ -435,7 +435,7 @@ static struct peer *bgpPeerTable_lookup(struct variable *v, oid name[],
                if (peer == NULL)
                        return NULL;
 
-               oid_copy_addr(name + namelen, addr, sizeof(struct in_addr));
+               oid_copy_in_addr(name + namelen, addr);
                *length = sizeof(struct in_addr) + namelen;
 
                return peer;
@@ -767,14 +767,12 @@ static struct bgp_path_info *bgp4PathAttrLookup(struct variable *v, oid name[],
                                        v->namelen + BGP_PATHATTR_ENTRY_OFFSET;
 
                                offset = name + v->namelen;
-                               oid_copy_addr(offset, &rn_p->u.prefix4,
-                                             IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset, &rn_p->u.prefix4);
                                offset += IN_ADDR_SIZE;
                                *offset = rn_p->prefixlen;
                                offset++;
-                               oid_copy_addr(offset,
-                                             &min->peer->su.sin.sin_addr,
-                                             IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset,
+                                                &min->peer->su.sin.sin_addr);
                                addr->prefix = rn_p->u.prefix4;
                                addr->prefixlen = rn_p->prefixlen;
 
@@ -868,7 +866,7 @@ static int bgpTrapEstablished(struct peer *peer)
        if (ret == 0)
                return 0;
 
-       oid_copy_addr(index, &addr, IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &addr);
 
        smux_trap(bgp_variables, array_size(bgp_variables), bgp_trap_oid,
                  array_size(bgp_trap_oid), bgp_oid,
@@ -887,7 +885,7 @@ static int bgpTrapBackwardTransition(struct peer *peer)
        if (ret == 0)
                return 0;
 
-       oid_copy_addr(index, &addr, IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &addr);
 
        smux_trap(bgp_variables, array_size(bgp_variables), bgp_trap_oid,
                  array_size(bgp_trap_oid), bgp_oid,
index 3b232be3868fce90ea49d30d98a724e63848a802..9ada292feb84f5ca540e3f8d7bdaa05e50649094 100644 (file)
@@ -588,8 +588,7 @@ static struct eigrp_neighbor *eigrpNbrLookup(struct variable *v, oid *name,
 
                if (nbr) {
                        *length = v->namelen + IN_ADDR_SIZE + 1;
-                       oid_copy_addr(name + v->namelen, nbr_addr,
-                                     IN_ADDR_SIZE);
+                       oid_copy_in_addr(name + v->namelen, nbr_addr);
                        name[v->namelen + IN_ADDR_SIZE] = *ifindex;
                        return nbr;
                }
index 3f59d18aa8e76da640eacc1c620ea635fefaa4b5..9fb4e465159548b6903681ec6b77658a46af62c8 100644 (file)
@@ -301,8 +301,7 @@ static uint8_t *ldpEntityTable(struct variable *v, oid name[], size_t *length,
 
                /* Append index */
                *length = LDP_ENTITY_TOTAL_LEN;
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                             IN_ADDR_SIZE);
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX;
@@ -402,8 +401,7 @@ static uint8_t *ldpEntityStatsTable(struct variable *v, oid name[],
 
                /* Append index */
                *length = LDP_ENTITY_TOTAL_LEN;
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                             IN_ADDR_SIZE);
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX;
@@ -640,13 +638,11 @@ static uint8_t *ldpHelloAdjacencyTable(struct variable *v, oid name[], size_t *l
 
                struct in_addr peerLdpId = ctl_adj->id;
 
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = LDP_DEFAULT_ENTITY_INDEX;
-               oid_copy_addr(name + v->namelen + 7, &peerLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen + 7, &peerLdpId);
                name[v->namelen + 11] = 0;
                name[v->namelen + 12] = 0;
                name[v->namelen + 13] = adjacencyIndex;
@@ -804,14 +800,12 @@ static uint8_t *ldpPeerTable(struct variable *v, oid name[], size_t *length,
                memcpy(name, v->name, v->namelen * sizeof(oid));
 
                /* Append index */
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
 
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = entityIndex;
-               oid_copy_addr(name + v->namelen + 7, &peerLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen + 7, &peerLdpId);
                name[v->namelen + 11] = 0;
                name[v->namelen + 12] = 0;
 
@@ -875,14 +869,12 @@ static uint8_t *ldpSessionTable(struct variable *v, oid name[], size_t *length,
                memcpy(name, v->name, v->namelen * sizeof(oid));
 
                /* Append index */
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
 
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = entityIndex;
-               oid_copy_addr(name + v->namelen + 7, &peerLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen + 7, &peerLdpId);
                name[v->namelen + 11] = 0;
                name[v->namelen + 12] = 0;
 
@@ -961,13 +953,11 @@ static uint8_t *ldpSessionStatsTable(struct variable *v, oid name[],
                memcpy(name, v->name, v->namelen * sizeof(oid));
 
                /* Append index */
-               oid_copy_addr(name + v->namelen, &entityLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, &entityLdpId);
                name[v->namelen + 4] = 0;
                name[v->namelen + 5] = 0;
                name[v->namelen + 6] = entityIndex;
-               oid_copy_addr(name + v->namelen + 7, &peerLdpId,
-                       sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen + 7, &peerLdpId);
                name[v->namelen + 11] = 0;
                name[v->namelen + 12] = 0;
 
@@ -1147,15 +1137,15 @@ ldpTrapSession(struct nbr * nbr, unsigned int sptrap)
        entityIndex = LDP_DEFAULT_ENTITY_INDEX;
        peerLdpId = ctl_nbr->id;
 
-        oid_copy_addr(index, &entityLdpId, sizeof(struct in_addr));
-        index[4] = 0;
-        index[5] = 0;
-        index[6] = entityIndex;
-        oid_copy_addr(&index[7], &peerLdpId, sizeof(struct in_addr));
-        index[11] = 0;
-        index[12] = 0;
+       oid_copy_in_addr(index, &entityLdpId);
+       index[4] = 0;
+       index[5] = 0;
+       index[6] = entityIndex;
+       oid_copy_in_addr(&index[7], &peerLdpId);
+       index[11] = 0;
+       index[12] = 0;
 
-        index[LDP_PEER_ENTRY_MAX_IDX_LEN] = 0;
+       index[LDP_PEER_ENTRY_MAX_IDX_LEN] = 0;
 
         smux_trap(ldpe_variables, array_size(ldpe_variables), ldp_trap_oid,
                   array_size(ldp_trap_oid), ldp_oid,
index c063833e41518e49910badea14e046d007e072da..74447341d8b5c2cd9397125796fb1ae977139963 100644 (file)
@@ -152,7 +152,8 @@ 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);
+extern void oid_copy_in_addr(oid[], const struct in_addr *);
+extern void oid_copy_in6_addr(oid[], const struct in6_addr *);
 extern void oid_copy_int(oid oid[], int *val);
 extern void oid2string(oid oid[], int len, char *string);
 extern void oid_copy_str(oid oid[], const char *string, int len);
index 17a4ed4a1dfd4e8ca0462ba50229c33be77200dd..23d3f38b31df3c7591c754b85dbd49c0f5a311e9 100644 (file)
@@ -88,13 +88,24 @@ void oid2int(oid oid[], int *dest)
        *dest = ntohl(network_dest);
 }
 
-void oid_copy_addr(oid oid[], const struct in_addr *addr, int len)
+void oid_copy_in_addr(oid oid[], const struct in_addr *addr)
 {
        int i;
        const uint8_t *pnt;
+       int len = sizeof(struct in_addr);
 
-       if (len == 0)
-               return;
+       pnt = (uint8_t *)addr;
+
+       for (i = 0; i < len; i++)
+               oid[i] = *pnt++;
+}
+
+
+void oid_copy_in6_addr(oid oid[], const struct in6_addr *addr)
+{
+       int i;
+       const uint8_t *pnt;
+       int len = sizeof(struct in6_addr);
 
        pnt = (uint8_t *)addr;
 
index 8418bbf2b948ef5c6262393ddbfdc6022a841e5e..43b998ac5bfc1f182fe8405b1f70e5136f5a42ca 100644 (file)
@@ -674,7 +674,7 @@ static struct ospf_area *ospfAreaLookup(struct variable *v, oid name[],
                if (area == NULL)
                        return NULL;
 
-               oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, addr);
                *length = sizeof(struct in_addr) + v->namelen;
 
                return area;
@@ -800,7 +800,7 @@ static struct ospf_area *ospfStubAreaLookup(struct variable *v, oid name[],
                if (area == NULL)
                        return NULL;
 
-               oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, addr);
                /* Set TOS 0. */
                name[v->namelen + sizeof(struct in_addr)] = 0;
                *length = v->namelen + sizeof(struct in_addr) + 1;
@@ -1008,15 +1008,14 @@ static struct ospf_lsa *ospfLsdbLookup(struct variable *v, oid *name,
 
                                /* Fill in value. */
                                offset = name + v->namelen;
-                               oid_copy_addr(offset, area_id, IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset, area_id);
                                offset += IN_ADDR_SIZE;
                                *offset = lsa->data->type;
                                offset++;
-                               oid_copy_addr(offset, &lsa->data->id,
-                                             IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset, &lsa->data->id);
                                offset += IN_ADDR_SIZE;
-                               oid_copy_addr(offset, &lsa->data->adv_router,
-                                             IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset,
+                                                &lsa->data->adv_router);
 
                                return lsa;
                        }
@@ -1170,9 +1169,9 @@ static struct ospf_area_range *ospfAreaRangeLookup(struct variable *v,
 
                                /* Fill in value. */
                                offset = name + v->namelen;
-                               oid_copy_addr(offset, area_id, IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset, area_id);
                                offset += IN_ADDR_SIZE;
-                               oid_copy_addr(offset, range_net, IN_ADDR_SIZE);
+                               oid_copy_in_addr(offset, range_net);
 
                                return range;
                        }
@@ -1573,7 +1572,7 @@ static struct ospf_interface *ospfIfLookup(struct variable *v, oid *name,
                if (oi) {
                        *length = v->namelen + IN_ADDR_SIZE + 1;
                        offset = name + v->namelen;
-                       oid_copy_addr(offset, ifaddr, IN_ADDR_SIZE);
+                       oid_copy_in_addr(offset, ifaddr);
                        offset += IN_ADDR_SIZE;
                        *offset = *ifindex;
                        return oi;
@@ -1717,7 +1716,7 @@ static struct ospf_interface *ospfIfMetricLookup(struct variable *v, oid *name,
                if (oi) {
                        *length = v->namelen + IN_ADDR_SIZE + 1 + 1;
                        offset = name + v->namelen;
-                       oid_copy_addr(offset, ifaddr, IN_ADDR_SIZE);
+                       oid_copy_in_addr(offset, ifaddr);
                        offset += IN_ADDR_SIZE;
                        *offset = *ifindex;
                        offset++;
@@ -1906,9 +1905,9 @@ ospfVirtIfLookup(struct variable *v, oid *name, size_t *length,
 
                if (vl_data) {
                        *length = v->namelen + IN_ADDR_SIZE + IN_ADDR_SIZE;
-                       oid_copy_addr(name + v->namelen, area_id, IN_ADDR_SIZE);
-                       oid_copy_addr(name + v->namelen + IN_ADDR_SIZE,
-                                     neighbor, IN_ADDR_SIZE);
+                       oid_copy_in_addr(name + v->namelen, area_id);
+                       oid_copy_in_addr(name + v->namelen + IN_ADDR_SIZE,
+                                        neighbor);
                        return vl_data;
                }
        }
@@ -2083,8 +2082,7 @@ static struct ospf_neighbor *ospfNbrLookup(struct variable *v, oid *name,
 
                if (nbr) {
                        *length = v->namelen + IN_ADDR_SIZE + 1;
-                       oid_copy_addr(name + v->namelen, nbr_addr,
-                                     IN_ADDR_SIZE);
+                       oid_copy_in_addr(name + v->namelen, nbr_addr);
                        name[v->namelen + IN_ADDR_SIZE] = *ifindex;
                        return nbr;
                }
@@ -2307,10 +2305,9 @@ static struct ospf_lsa *ospfExtLsdbLookup(struct variable *v, oid *name,
 
                        *offset = OSPF_AS_EXTERNAL_LSA;
                        offset++;
-                       oid_copy_addr(offset, &lsa->data->id, IN_ADDR_SIZE);
+                       oid_copy_in_addr(offset, &lsa->data->id);
                        offset += IN_ADDR_SIZE;
-                       oid_copy_addr(offset, &lsa->data->adv_router,
-                                     IN_ADDR_SIZE);
+                       oid_copy_in_addr(offset, &lsa->data->adv_router);
 
                        return lsa;
                }
@@ -2440,7 +2437,7 @@ static void ospfTrapNbrStateChange(struct ospf_neighbor *on)
                zlog_info("%s: trap sent: %pI4 now %s", __func__,
                          &on->address.u.prefix4, msgbuf);
 
-       oid_copy_addr(index, &(on->address.u.prefix4), IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &(on->address.u.prefix4));
        index[IN_ADDR_SIZE] = 0;
 
        smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid,
@@ -2455,7 +2452,7 @@ static void ospfTrapVirtNbrStateChange(struct ospf_neighbor *on)
 
        zlog_info("ospfTrapVirtNbrStateChange trap sent");
 
-       oid_copy_addr(index, &(on->address.u.prefix4), IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &(on->address.u.prefix4));
        index[IN_ADDR_SIZE] = 0;
 
        smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid,
@@ -2499,7 +2496,7 @@ static void ospfTrapIfStateChange(struct ospf_interface *oi)
                          &oi->address->u.prefix4,
                          lookup_msg(ospf_ism_state_msg, oi->state, NULL));
 
-       oid_copy_addr(index, &(oi->address->u.prefix4), IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &(oi->address->u.prefix4));
        index[IN_ADDR_SIZE] = 0;
 
        smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid,
@@ -2514,7 +2511,7 @@ static void ospfTrapVirtIfStateChange(struct ospf_interface *oi)
 
        zlog_info("ospfTrapVirtIfStateChange trap sent");
 
-       oid_copy_addr(index, &(oi->address->u.prefix4), IN_ADDR_SIZE);
+       oid_copy_in_addr(index, &(oi->address->u.prefix4));
        index[IN_ADDR_SIZE] = 0;
 
        smux_trap(ospf_variables, array_size(ospf_variables), ospf_trap_oid,
index 37bce7484cc1582a356880d195dd8eda2cd94e0f..b922d669123e28089d520511d2b7b8f92b743564 100644 (file)
@@ -271,7 +271,7 @@ static struct interface *rip2IfLookup(struct variable *v, oid name[],
                if (ifp == NULL)
                        return NULL;
 
-               oid_copy_addr(name + v->namelen, addr, sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, addr);
 
                *length = v->namelen + sizeof(struct in_addr);
 
@@ -320,8 +320,8 @@ static struct rip_peer *rip2PeerLookup(struct variable *v, oid name[],
                            || (peer->domain
                                > (int)name[v->namelen
                                            + sizeof(struct in_addr)])) {
-                               oid_copy_addr(name + v->namelen, &peer->addr,
-                                             sizeof(struct in_addr));
+                               oid_copy_in_addr(name + v->namelen,
+                                                &peer->addr);
                                name[v->namelen + sizeof(struct in_addr)] =
                                        peer->domain;
                                *length =
@@ -334,8 +334,7 @@ static struct rip_peer *rip2PeerLookup(struct variable *v, oid name[],
                if (!peer)
                        return NULL;
 
-               oid_copy_addr(name + v->namelen, &peer->addr,
-                             sizeof(struct in_addr));
+               oid_copy_in_addr(name + v->namelen, &peer->addr);
                name[v->namelen + sizeof(struct in_addr)] = peer->domain;
                *length = sizeof(struct in_addr) + v->namelen + 1;