stroke: Default to %dynamic if no valid TS are specified in left|rightsubnet

Otherwise, we'd end up with an empty TS list, which is not valid.

Because end->tohost is set to !end->subnets in starter the removed branch was
never used.
This commit is contained in:
Tobias Brunner
2017-01-25 16:56:28 +01:00
parent 014737dd54
commit 69b58e347e
+49 -62
View File
@@ -982,74 +982,61 @@ static void add_ts(private_stroke_config_t *this,
stroke_end_t *end, child_cfg_t *child_cfg, bool local)
{
traffic_selector_t *ts;
bool ts_added = FALSE;
if (end->tohost)
if (end->subnets)
{
enumerator_t *enumerator;
char *subnet, *pos;
uint16_t from_port, to_port;
uint8_t proto;
enumerator = enumerator_create_token(end->subnets, ",", " ");
while (enumerator->enumerate(enumerator, &subnet))
{
from_port = end->from_port;
to_port = end->to_port;
proto = end->protocol;
pos = strchr(subnet, '[');
if (pos)
{
*(pos++) = '\0';
if (!parse_protoport(pos, &from_port, &to_port, &proto))
{
DBG1(DBG_CFG, "invalid proto/port: %s, skipped subnet",
pos);
continue;
}
}
if (streq(subnet, "%dynamic"))
{
ts = traffic_selector_create_dynamic(proto,
from_port, to_port);
}
else
{
ts = traffic_selector_create_from_cidr(subnet, proto,
from_port, to_port);
}
if (ts)
{
child_cfg->add_traffic_selector(child_cfg, local, ts);
ts_added = TRUE;
}
else
{
DBG1(DBG_CFG, "invalid subnet: %s, skipped", subnet);
}
}
enumerator->destroy(enumerator);
}
if (!ts_added)
{
ts = traffic_selector_create_dynamic(end->protocol,
end->from_port, end->to_port);
child_cfg->add_traffic_selector(child_cfg, local, ts);
}
else
{
if (!end->subnets)
{
host_t *net;
net = host_create_from_string(end->address, 0);
if (net)
{
ts = traffic_selector_create_from_subnet(net, 0, end->protocol,
end->from_port, end->to_port);
child_cfg->add_traffic_selector(child_cfg, local, ts);
}
}
else
{
enumerator_t *enumerator;
char *subnet, *pos;
uint16_t from_port, to_port;
uint8_t proto;
enumerator = enumerator_create_token(end->subnets, ",", " ");
while (enumerator->enumerate(enumerator, &subnet))
{
from_port = end->from_port;
to_port = end->to_port;
proto = end->protocol;
pos = strchr(subnet, '[');
if (pos)
{
*(pos++) = '\0';
if (!parse_protoport(pos, &from_port, &to_port, &proto))
{
DBG1(DBG_CFG, "invalid proto/port: %s, skipped subnet",
pos);
continue;
}
}
if (streq(subnet, "%dynamic"))
{
ts = traffic_selector_create_dynamic(proto,
from_port, to_port);
}
else
{
ts = traffic_selector_create_from_cidr(subnet, proto,
from_port, to_port);
}
if (ts)
{
child_cfg->add_traffic_selector(child_cfg, local, ts);
}
else
{
DBG1(DBG_CFG, "invalid subnet: %s, skipped", subnet);
}
}
enumerator->destroy(enumerator);
}
}
}
/**