sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
- rb_tree_insert_node(routes, rt);
- n++;
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
+ else
+ n++;
}
return n;
}
sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
- rb_tree_insert_node(routes, rt);
- n++;
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
+ else
+ n++;
}
}
sa_in_init(&rt->rt_dest, &dest);
sa_in_init(&rt->rt_netmask, &netmask);
sa_in_init(&rt->rt_gateway, &gateway);
- rb_tree_insert_node(routes, rt);
- n++;
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
+ else
+ n++;
}
}
sa_in_init(&rt->rt_dest, &addr);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr3);
- rb_tree_insert_node(&ifo->routes, rt);
+ if (rb_tree_insert_node(&ifo->routes, rt) != rt)
+ rt_free(rt);
*fp = ' ';
} else if (strncmp(arg, "routers=", strlen("routers=")) == 0) {
if (parse_addr(&addr, NULL, p) == -1)
sa_in_init(&rt->rt_dest, &addr2);
sa_in_init(&rt->rt_netmask, &addr2);
sa_in_init(&rt->rt_gateway, &addr);
- rb_tree_insert_node(&ifo->routes, rt);
+ if (rb_tree_insert_node(&ifo->routes, rt) != rt)
+ rt_free(rt);
} else if (strncmp(arg, "interface_mtu=",
strlen("interface_mtu=")) == 0 ||
strncmp(arg, "mtu=", strlen("mtu=")) == 0)
//in.s_addr = INADDR_ANY;
//sa_in_init(&rt->rt_gateway, &in);
rt->rt_gateway.sa_family = AF_UNSPEC;
- rb_tree_insert_node(&nroutes, rt);
+ if (rb_tree_insert_node(&nroutes, rt) != rt)
+ rt_free(rt);
}
/* If any set routes, grab them, otherwise DHCP routes. */
memcpy(rt, r, sizeof(*rt));
rt_setif(rt, ifp);
rt->rt_dflags = RTDF_STATIC;
- rb_tree_insert_node(&nroutes, rt);
+ if (rb_tree_insert_node(&nroutes, rt) != rt)
+ rt_free(rt);
}
} else {
if (dhcp_get_routes(&nroutes, ifp) == -1)
sa_in_init(&rt->rt_netmask, &in);
sa_in_init(&rt->rt_gateway, &state->addr->brd);
sa_in_init(&rt->rt_ifa, &state->addr->addr);
- rb_tree_insert_node(&nroutes, rt);
+ if (rb_tree_insert_node(&nroutes, rt) != rt)
+ rt_free(rt);
}
/* Copy our address as the source address and set mtu */
if (!(rt->rt_dflags & RTDF_STATIC))
rt->rt_dflags |= RTDF_DHCP;
sa_in_init(&rt->rt_ifa, &state->addr->addr);
- rb_tree_insert_node(routes, rt);
- n++;
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
+ else
+ n++;
}
return n;
sa_in_init(&rth->rt_gateway, &in);
rth->rt_mtu = dhcp_get_mtu(ifp);
sa_in_init(&rth->rt_ifa, &state->addr->addr);
- rb_tree_insert_node(routes, rth);
+ if (rb_tree_insert_node(routes, rth) != rth)
+ rt_free(rth);
}
return 0;
}
in.s_addr = INADDR_ANY;
sa_in_init(&rt->rt_gateway, &in);
sa_in_init(&rt->rt_ifa, &state->addr->addr);
- rb_tree_insert_node(routes, rt);
+ if (rb_tree_insert_node(routes, rt) != rt) {
+ rt_free(rt);
+ return 0;
+ }
return 1;
}
sa_in_init(&rt->rt_netmask, &in);
sa_in_init(&rt->rt_gateway, &in);
sa_in_init(&rt->rt_ifa, &state->addr->addr);
- rb_tree_insert_node(routes, rt);
+ if (rb_tree_insert_node(routes, rt) != rt) {
+ rt_free(rt);
+ return 0;
+ }
return 1;
}
(IPV6_AF_ADDED | IPV6_AF_STATIC))
{
rt = inet6_makeprefix(ifp, NULL, ia);
- if (rt)
- rb_tree_insert_node(routes, rt);
+ if (rt && rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
}
}
}
rt = inet6_makeprefix(rap->iface, rap, addr);
if (rt) {
rt->rt_dflags |= RTDF_RA;
- rb_tree_insert_node(routes, rt);
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
}
}
if (rap->lifetime) {
rt = inet6_makerouter(rap);
if (rt) {
rt->rt_dflags |= RTDF_RA;
- rb_tree_insert_node(routes, rt);
- if (have_default)
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
+ else if (have_default)
*have_default = true;
}
}
if (rt == NULL)
continue;
rt->rt_dflags |= RTDF_DHCP;
- rb_tree_insert_node(routes, rt);
+ if (rb_tree_insert_node(routes, rt) != rt)
+ rt_free(rt);
}
}
}
assert(rt->rt_ifp->ctx != NULL);
ctx = rt->rt_ifp->ctx;
- f = rb_tree_find_node(&ctx->kroutes, rt);
switch(cmd) {
case RTM_DELETE:
+ f = rb_tree_find_node(&ctx->kroutes, rt);
if (f != NULL) {
rb_tree_remove_node(&ctx->kroutes, f);
rt_free(f);
}
break;
case RTM_ADD:
- if (f != NULL)
- break;
if ((f = rt_new(rt->rt_ifp)) == NULL)
break;
memcpy(f, rt, sizeof(*f));
- rb_tree_insert_node(&ctx->kroutes, f);
+ if (rb_tree_insert_node(&ctx->kroutes, f) != f)
+ rt_free(f);
break;
}
continue;
if (rt_doroute(rt)) {
rb_tree_remove_node(&routes, rt);
- rb_tree_insert_node(&added, rt);
+ if (rb_tree_insert_node(&added, rt) != rt) {
+ errno = EEXIST;
+ logerr(__func__);
+ rt_free(rt);
+ }
}
}
/* XXX This needs to be optimised. */
while ((rt = RB_TREE_MIN(&added)) != NULL) {
rb_tree_remove_node(&added, rt);
- rb_tree_insert_node(&ctx->routes, rt);
+ if (rb_tree_insert_node(&ctx->routes, rt) != rt) {
+ errno = EEXIST;
+ logerr(__func__);
+ rt_free(rt);
+ }
}
getfail: