Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 9 additions & 9 deletions src/dhcp.c
Original file line number Diff line number Diff line change
Expand Up @@ -434,9 +434,9 @@ decode_rfc3442_rt(rb_tree_t *routes, struct interface *ifp, const uint8_t *data,
if (netmask.s_addr == INADDR_BROADCAST)
rt->rt_flags = RTF_HOST;

sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
sa_in_init(rt->rt_dest, &dest);
sa_in_init(rt->rt_netmask, &netmask);
sa_in_init(rt->rt_gateway, &gateway);
if (rt_proto_add(routes, rt))
n = 1;
}
Expand Down Expand Up @@ -614,9 +614,9 @@ get_option_routes(rb_tree_t *routes, struct interface *ifp,
if (netmask.s_addr == INADDR_BROADCAST)
rt->rt_flags = RTF_HOST;

sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
sa_in_init(rt->rt_dest, &dest);
sa_in_init(rt->rt_netmask, &netmask);
sa_in_init(rt->rt_gateway, &gateway);
if (rt_proto_add(routes, rt))
n++;
}
Expand All @@ -636,9 +636,9 @@ get_option_routes(rb_tree_t *routes, struct interface *ifp,
return -1;
memcpy(&gateway.s_addr, p, sizeof(gateway.s_addr));
p += 4;
sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
sa_in_init(rt->rt_dest, &dest);
sa_in_init(rt->rt_netmask, &netmask);
sa_in_init(rt->rt_gateway, &gateway);
if (rt_proto_add(routes, rt))
n++;
}
Expand Down
2 changes: 1 addition & 1 deletion src/dhcpcd.c
Original file line number Diff line number Diff line change
Expand Up @@ -2201,7 +2201,7 @@ main(int argc, char **argv, char **envp)
ctx.ifc = argc - optind;
ctx.ifv = argv + optind;

rt_init(&ctx);
rt_init_routes(&ctx);

ifo = read_config(&ctx, NULL, NULL, NULL);
if (ifo == NULL) {
Expand Down
48 changes: 25 additions & 23 deletions src/if-bsd.c
Original file line number Diff line number Diff line change
Expand Up @@ -751,15 +751,15 @@ if_route(unsigned char cmd, const struct rt *rt)
rtm->rtm_flags |= RTF_PINNED;
#endif

gateway_unspec = sa_is_unspecified(&rt->rt_gateway);
gateway_unspec = sa_is_unspecified(rt->rt_gateway);

if (cmd == RTM_ADD || cmd == RTM_CHANGE) {
bool netmask_bcast = sa_is_allones(&rt->rt_netmask);
bool netmask_bcast = sa_is_allones(rt->rt_netmask);

rtm->rtm_flags |= RTF_UP;
rtm->rtm_addrs |= RTA_GATEWAY;
if (!(rtm->rtm_flags & RTF_REJECT) &&
!sa_is_loopback(&rt->rt_gateway)) {
!sa_is_loopback(rt->rt_gateway)) {
rtm->rtm_index = (unsigned short)rt->rt_ifp->index;
/*
* OpenBSD rejects this for on-link routes when there is no default route
Expand All @@ -770,10 +770,10 @@ if_route(unsigned char cmd, const struct rt *rt)
#ifdef __OpenBSD__
#warning kernel does not allow IPv6 address sharing
if (!gateway_unspec ||
rt->rt_dest.sa_family != AF_INET6)
rt->rt_dest->sa_family != AF_INET6)
#endif
rtm->rtm_addrs |= RTA_IFP;
if (!sa_is_unspecified(&rt->rt_ifa))
if (!sa_is_unspecified(rt->rt_ifa))
rtm->rtm_addrs |= RTA_IFA;
}
if (netmask_bcast)
Expand Down Expand Up @@ -822,31 +822,32 @@ if_route(unsigned char cmd, const struct rt *rt)

if_linkaddr(&sdl, rt->rt_ifp);

ADDSA(&rt->rt_dest);
ADDSA(rt->rt_dest);

if (rtm->rtm_addrs & RTA_GATEWAY) {
if (gateway_unspec)
ADDSA((struct sockaddr *)&sdl);
else {
union sa_ss gateway;
struct sockaddr_storage gss;
struct sockaddr *gsa = (struct sockaddr *)&gss;

if_copysa(&gateway.sa, &rt->rt_gateway);
if_copysa(gsa, rt->rt_gateway);
#ifdef INET6
if (gateway.sa.sa_family == AF_INET6)
ipv6_setscope(&gateway.sin6, rt->rt_ifp->index);
if (gss.ss_family == AF_INET6)
ipv6_setscope((struct sockaddr_in6 *)&gss, rt->rt_ifp->index);
#endif
ADDSA(&gateway.sa);
ADDSA(gsa);
}
}

if (rtm->rtm_addrs & RTA_NETMASK)
ADDSA(&rt->rt_netmask);
ADDSA(rt->rt_netmask);

if (rtm->rtm_addrs & RTA_IFP)
ADDSA((struct sockaddr *)&sdl);

if (rtm->rtm_addrs & RTA_IFA)
ADDSA(&rt->rt_ifa);
ADDSA(rt->rt_ifa);

#undef ADDSA

Expand Down Expand Up @@ -903,13 +904,13 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm)
if (get_addrs(rtm->rtm_addrs, (const char *)rtm + sizeof(*rtm),
rtm->rtm_msglen - sizeof(*rtm), rti_info) == -1)
return -1;
memset(rt, 0, sizeof(*rt));

rt_init(rt);
rt->rt_flags = (unsigned int)rtm->rtm_flags;
if_copysa(&rt->rt_dest, rti_info[RTAX_DST]);
if_copysa(rt->rt_dest, rti_info[RTAX_DST]);

if (rtm->rtm_addrs & RTA_NETMASK) {
if_copysa(&rt->rt_netmask, rti_info[RTAX_NETMASK]);
if_copysa(rt->rt_netmask, rti_info[RTAX_NETMASK]);
/*
* Netmask family and length are ignored by traditional
* userland tools such as route and netstat and are assumed
Expand All @@ -921,8 +922,8 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm)
*
* This is currently true for all BSD kernels.
*/
rt->rt_netmask.sa_family = rt->rt_dest.sa_family;
rt->rt_netmask.sa_len = rt->rt_dest.sa_len;
rt->rt_netmask->sa_family = rt->rt_dest->sa_family;
rt->rt_netmask->sa_len = rt->rt_dest->sa_len;
}

/* dhcpcd likes an unspecified gateway to indicate via the link.
Expand All @@ -936,11 +937,11 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, const struct rt_msghdr *rtm)
if (sdl->sdl_alen != 0)
rt->rt_dflags |= RTDF_GATELINK;
} else if (rtm->rtm_flags & RTF_GATEWAY)
if_copysa(&rt->rt_gateway, rti_info[RTAX_GATEWAY]);
if_copysa(rt->rt_gateway, rti_info[RTAX_GATEWAY]);
}

if (rtm->rtm_addrs & RTA_IFA)
if_copysa(&rt->rt_ifa, rti_info[RTAX_IFA]);
if_copysa(rt->rt_ifa, rti_info[RTAX_IFA]);

rt->rt_mtu = (unsigned int)rtm->rtm_rmx.rmx_mtu;

Expand Down Expand Up @@ -1018,7 +1019,7 @@ if_initrt(struct dhcpcd_ctx *ctx, rb_tree_t *kroutes, int af)
logerr(__func__);
break;
}
memcpy(rtn, &rt, sizeof(*rtn));
rt_copy(rtn, &rt);
if (rb_tree_insert_node(kroutes, rtn) != rtn)
rt_free(rtn);
}
Expand Down Expand Up @@ -1332,15 +1333,16 @@ if_rtm(struct dhcpcd_ctx *ctx, const struct rt_msghdr *rtm)
* existance with a hardware address.
* Ensure we don't call this for a newly incomplete state.
*/
if (rt.rt_dest.sa_family == AF_INET6 &&
if (rt.rt_dest->sa_family == AF_INET6 &&
(rt.rt_flags & RTF_HOST || rtm->rtm_type == RTM_MISS) &&
!(rtm->rtm_type == RTM_ADD && !(rt.rt_dflags & RTDF_GATELINK))) {
bool reachable;
struct sockaddr_in6 *dest = (struct sockaddr_in6 *)&rt.rt_ss_dest;

reachable = (rtm->rtm_type == RTM_ADD ||
rtm->rtm_type == RTM_CHANGE) &&
rt.rt_dflags & RTDF_GATELINK;
ipv6nd_neighbour(ctx, &rt.rt_ss_dest.sin6.sin6_addr, reachable);
ipv6nd_neighbour(ctx, &dest->sin6_addr, reachable);
}
#endif

Expand Down
48 changes: 21 additions & 27 deletions src/if-linux.c
Original file line number Diff line number Diff line change
Expand Up @@ -689,7 +689,7 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm)
if (rtm->rtm_table != RT_TABLE_MAIN)
return -1;

memset(rt, 0, sizeof(*rt));
rt_init(rt);
if (rtm->rtm_type == RTN_UNREACHABLE)
rt->rt_flags |= RTF_REJECT;

Expand All @@ -699,11 +699,11 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm)
sa = NULL;
switch (rta->rta_type) {
case RTA_DST:
sa = &rt->rt_dest;
sa = rt->rt_dest;
break;
case RTA_SRC: {
union sa_ss ssa;
struct sockaddr *psa = (struct sockaddr *)&ssa;
struct sockaddr_storage ss;
struct sockaddr *psa = (struct sockaddr *)&ss;
socklen_t salen;

psa->sa_family = rtm->rtm_family;
Expand All @@ -722,10 +722,10 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm)
break;
}
case RTA_GATEWAY:
sa = &rt->rt_gateway;
sa = rt->rt_gateway;
break;
case RTA_PREFSRC:
sa = &rt->rt_ifa;
sa = rt->rt_ifa;
break;
case RTA_OIF:
ifindex = *(unsigned int *)RTA_DATA(rta);
Expand Down Expand Up @@ -784,20 +784,18 @@ if_copyrt(struct dhcpcd_ctx *ctx, struct rt *rt, struct nlmsghdr *nlm)

sa->sa_family = rtm->rtm_family;
salen = sa_addrlen(sa);
/* sa is a union where sockaddr_in6 is the biggest. */
/* coverity[overrun-buffer-arg] */
memcpy((char *)sa + sa_addroffset(sa), RTA_DATA(rta),
MIN(salen, RTA_PAYLOAD(rta)));
}
}

/* If no RTA_DST set the unspecified address for the family. */
if (rt->rt_dest.sa_family == AF_UNSPEC)
rt->rt_dest.sa_family = rtm->rtm_family;
if (rt->rt_dest->sa_family == AF_UNSPEC)
rt->rt_dest->sa_family = rtm->rtm_family;

rt->rt_netmask.sa_family = rtm->rtm_family;
sa_fromprefix(&rt->rt_netmask, rtm->rtm_dst_len);
if (sa_is_allones(&rt->rt_netmask))
rt->rt_netmask->sa_family = rtm->rtm_family;
sa_fromprefix(rt->rt_netmask, rtm->rtm_dst_len);
if (sa_is_allones(rt->rt_netmask))
rt->rt_flags |= RTF_HOST;

#if 0
Expand Down Expand Up @@ -1662,10 +1660,10 @@ if_route(unsigned char cmd, const struct rt *rt)
break;
}
nlm.hdr.nlmsg_flags |= NLM_F_REQUEST;
nlm.rt.rtm_family = (unsigned char)rt->rt_dest.sa_family;
nlm.rt.rtm_family = (unsigned char)rt->rt_dest->sa_family;
nlm.rt.rtm_table = RT_TABLE_MAIN;

gateway_unspec = sa_is_unspecified(&rt->rt_gateway);
gateway_unspec = sa_is_unspecified(rt->rt_gateway);

if (cmd == RTM_DELETE) {
nlm.rt.rtm_scope = RT_SCOPE_NOWHERE;
Expand Down Expand Up @@ -1702,22 +1700,18 @@ if_route(unsigned char cmd, const struct rt *rt)
add_attr_l(&nlm.hdr, sizeof(nlm), (type), \
(const char *)(sa) + sa_addroffset((sa)), \
(unsigned short)sa_addrlen((sa)));
nlm.rt.rtm_dst_len = (unsigned char)sa_toprefix(&rt->rt_netmask);
/* rt->rt_dest and rt->gateway are unions where sockaddr_in6
* is the biggest member. However, we access them as the
* generic sockaddr and coverity thinks this will overrun. */
/* coverity[overrun-buffer-arg] */
ADDSA(RTA_DST, &rt->rt_dest);
nlm.rt.rtm_dst_len = (unsigned char)sa_toprefix(rt->rt_netmask);
ADDSA(RTA_DST, rt->rt_dest);
if (cmd == RTM_ADD || cmd == RTM_CHANGE) {
if (!gateway_unspec) {
/* coverity[overrun-buffer-arg] */
ADDSA(RTA_GATEWAY, &rt->rt_gateway);
ADDSA(RTA_GATEWAY, rt->rt_gateway);
}
/* Cannot add tentative source addresses.
* We don't know this here, so just skip INET6 ifa's.*/
if (!sa_is_unspecified(&rt->rt_ifa) &&
rt->rt_ifa.sa_family != AF_INET6)
ADDSA(RTA_PREFSRC, &rt->rt_ifa);
if (!sa_is_unspecified(rt->rt_ifa) &&
rt->rt_ifa->sa_family != AF_INET6)
ADDSA(RTA_PREFSRC, rt->rt_ifa);
if (rt->rt_mtu) {
char metricsbuf[32];
struct rtattr *metrics = (void *)metricsbuf;
Expand Down Expand Up @@ -1754,7 +1748,7 @@ if_route(unsigned char cmd, const struct rt *rt)
#endif
}

if (!sa_is_loopback(&rt->rt_gateway))
if (!sa_is_loopback(rt->rt_gateway))
add_attr_32(&nlm.hdr, sizeof(nlm), RTA_OIF, rt->rt_ifp->index);

#ifdef HAVE_ROUTE_LIFETIME
Expand Down Expand Up @@ -1785,7 +1779,7 @@ _if_initrt(struct dhcpcd_ctx *ctx, void *arg, struct nlmsghdr *nlm)
logerr(__func__);
return 0;
}
memcpy(rtn, &rt, sizeof(*rtn));
rt_copy(rtn, &rt);
if (rb_tree_insert_node(kroutes, rtn) != rtn)
rt_free(rtn);
return 0;
Expand Down
12 changes: 6 additions & 6 deletions src/if-options.c
Original file line number Diff line number Diff line change
Expand Up @@ -1330,9 +1330,9 @@ parse_option(struct dhcpcd_ctx *ctx, const char *ifname, struct if_options *ifo,
*fp = ' ';
if ((rt = rt_new0(ctx)) == NULL)
return -1;
sa_in_init(&rt->rt_dest, &addr);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr3);
sa_in_init(rt->rt_dest, &addr);
sa_in_init(rt->rt_netmask, &addr2);
sa_in_init(rt->rt_gateway, &addr3);
if (rt_proto_add_ctx(&ifo->routes, rt, ctx))
add_environ(&ifo->config, arg, 0);
#else
Expand All @@ -1351,9 +1351,9 @@ parse_option(struct dhcpcd_ctx *ctx, const char *ifname, struct if_options *ifo,
if ((rt = rt_new0(ctx)) == NULL)
return -1;
addr2.s_addr = INADDR_ANY;
sa_in_init(&rt->rt_dest, &addr2);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr);
sa_in_init(rt->rt_dest, &addr2);
sa_in_init(rt->rt_netmask, &addr2);
sa_in_init(rt->rt_gateway, &addr);
if (rt_proto_add_ctx(&ifo->routes, rt, ctx))
add_environ(&ifo->config, arg, 0);
#else
Expand Down
Loading