net-util: verify the address family

Error out if the address family is already set to something incompatible with the
address being parsed.
This commit is contained in:
Tom Gundersen 2014-01-28 20:00:47 +01:00
parent eb27aeca24
commit 801bd9e859
5 changed files with 24 additions and 15 deletions

View File

@ -46,6 +46,8 @@ int address_new_static(Network *network, unsigned section, Address **ret) {
if (!address)
return -ENOMEM;
address->family = AF_UNSPEC;
address->network = network;
LIST_PREPEND(static_addresses, network->static_addresses, address);
@ -68,6 +70,8 @@ int address_new_dynamic(Address **ret) {
if (!address)
return -ENOMEM;
address->family = AF_UNSPEC;
*ret = address;
address = NULL;

View File

@ -84,12 +84,6 @@ static int network_load_one(Manager *manager, const char *filename) {
"Ignoring", filename);
return 0;
}
if (route->dst_family && route->family != route->dst_family) {
log_warning("Route section with conflicting Gateway and Destination address "
"family configured in %s. Ignoring", filename);
return 0;
}
}
LIST_FOREACH(static_addresses, address, network->static_addresses) {

View File

@ -47,6 +47,8 @@ int route_new_static(Network *network, unsigned section, Route **ret) {
if (!route)
return -ENOMEM;
route->family = AF_UNSPEC;
route->network = network;
LIST_PREPEND(static_routes, network->static_routes, route);
@ -69,6 +71,8 @@ int route_new_dynamic(Route **ret) {
if (!route)
return -ENOMEM;
route->family = AF_UNSPEC;
*ret = route;
route = NULL;
@ -231,7 +235,7 @@ int config_parse_destination(const char *unit,
return log_oom();
}
r = net_parse_inaddr(address, &n->dst_family, &n->dst_addr);
r = net_parse_inaddr(address, &n->family, &n->dst_addr);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
"Destination is invalid, ignoring assignment: %s", address);
@ -252,7 +256,7 @@ int config_parse_destination(const char *unit,
n->dst_prefixlen = (unsigned char) i;
} else {
switch (n->dst_family) {
switch (n->family) {
case AF_INET:
n->dst_prefixlen = 32;
break;

View File

@ -138,7 +138,6 @@ struct Route {
uint64_t section;
unsigned char family;
unsigned char dst_family;
unsigned char dst_prefixlen;
union {

View File

@ -192,16 +192,24 @@ int net_parse_inaddr(const char *address, unsigned char *family, void *dst) {
/* IPv4 */
r = inet_pton(AF_INET, address, dst);
if (r > 0)
*family = AF_INET; /* successfully parsed IPv4 address */
else if (r < 0)
if (r > 0) {
/* succsefully parsed IPv4 address */
if (*family == AF_UNSPEC)
*family = AF_INET;
else if (*family != AF_INET)
return -EINVAL;
} else if (r < 0)
return -errno;
else {
/* not an IPv4 address, so let's try IPv6 */
r = inet_pton(AF_INET6, address, dst);
if (r > 0)
*family = AF_INET6; /* successfully parsed IPv6 address */
else if (r < 0)
if (r > 0) {
/* successfully parsed IPv6 address */
if (*family == AF_UNSPEC)
*family = AF_INET6;
else if (*family != AF_INET6)
return -EINVAL;
} else if (r < 0)
return -errno;
else
return -EINVAL;