X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=proto.c;h=23304f35676ba68b46a2bbb60e764e80f5d779d6;hp=3b973d95b3ca8bd4fbb122ac731b59cd23d5ac95;hb=9905bd411c13ff151cf90ddf9ea3041c5f0e56fb;hpb=00fc987a147841a2e9bfd15399056886b6c77064 diff --git a/proto.c b/proto.c index 3b973d9..23304f3 100644 --- a/proto.c +++ b/proto.c @@ -123,17 +123,27 @@ parse_addr(struct interface *iface, const char *str, bool v6, int mask, return false; addr->mask = mask; - if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) { - interface_add_error(iface, "proto", "INVALID_ADDRESS", &str, 1); - free(addr); - return false; - } + if (!parse_ip_and_netmask(af, str, &addr->addr, &addr->mask)) + goto error; + + if (!v6) { + if (IN_EXPERIMENTAL(ntohl(addr->addr.in.s_addr))) + goto error; + + } else if (IN6_IS_ADDR_MULTICAST(&addr->addr.in6)) + goto error; if (broadcast) addr->broadcast = broadcast; vlist_add(&iface->proto_ip.addr, &addr->node, &addr->flags); return true; + +error: + interface_add_error(iface, "proto", "INVALID_ADDRESS", &str, 1); + free(addr); + + return false; } static int