X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fodhcpd.git;a=blobdiff_plain;f=src%2Fconfig.c;h=d025bdf23e99f3cf46924dfdc5f9db04c3a57e5d;hp=e9a61a9b5564cb0c24d1d267a670dc57e81006d8;hb=baee1992982f92a45870ba0aaea111c00963de5d;hpb=47bcdec8bd3bea91ef0510cdef7702bd559e8369 diff --git a/src/config.c b/src/config.c index e9a61a9..d025bdf 100644 --- a/src/config.c +++ b/src/config.c @@ -32,7 +32,6 @@ enum { IFACE_ATTR_NDP, IFACE_ATTR_DNS, IFACE_ATTR_DOMAIN, - IFACE_ATTR_ULA_COMPAT, IFACE_ATTR_RA_DEFAULT, IFACE_ATTR_RA_MANAGEMENT, IFACE_ATTR_RA_OFFLINK, @@ -60,7 +59,6 @@ static const struct blobmsg_policy iface_attrs[IFACE_ATTR_MAX] = { [IFACE_ATTR_NDP] = { .name = "ndp", .type = BLOBMSG_TYPE_STRING }, [IFACE_ATTR_DNS] = { .name = "dns", .type = BLOBMSG_TYPE_ARRAY }, [IFACE_ATTR_DOMAIN] = { .name = "domain", .type = BLOBMSG_TYPE_ARRAY }, - [IFACE_ATTR_ULA_COMPAT] = { .name = "ula_compat", .type = BLOBMSG_TYPE_BOOL }, [IFACE_ATTR_RA_DEFAULT] = { .name = "ra_default", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_MANAGEMENT] = { .name = "ra_management", .type = BLOBMSG_TYPE_INT32 }, [IFACE_ATTR_RA_OFFLINK] = { .name = "ra_offlink", .type = BLOBMSG_TYPE_BOOL }, @@ -89,7 +87,7 @@ enum { LEASE_ATTR_MAC, LEASE_ATTR_DUID, LEASE_ATTR_HOSTID, - LEASE_ATTR_HOSTNAME, + LEASE_ATTR_NAME, LEASE_ATTR_MAX }; @@ -99,7 +97,7 @@ static const struct blobmsg_policy lease_attrs[LEASE_ATTR_MAX] = { [LEASE_ATTR_MAC] = { .name = "mac", .type = BLOBMSG_TYPE_STRING }, [LEASE_ATTR_DUID] = { .name = "duid", .type = BLOBMSG_TYPE_STRING }, [LEASE_ATTR_HOSTID] = { .name = "hostid", .type = BLOBMSG_TYPE_STRING }, - [LEASE_ATTR_HOSTNAME] = { .name = "hostname", .type = BLOBMSG_TYPE_STRING }, + [LEASE_ATTR_NAME] = { .name = "name", .type = BLOBMSG_TYPE_STRING }, }; @@ -110,7 +108,7 @@ const struct uci_blob_param_list lease_attr_list = { enum { - ODHCPD_ATTR_LEGACY, + ODHCPD_ATTR_MAINDHCP, ODHCPD_ATTR_LEASEFILE, ODHCPD_ATTR_LEASETRIGGER, ODHCPD_ATTR_MAX @@ -118,7 +116,7 @@ enum { static const struct blobmsg_policy odhcpd_attrs[LEASE_ATTR_MAX] = { - [ODHCPD_ATTR_LEGACY] = { .name = "legacy", .type = BLOBMSG_TYPE_BOOL }, + [ODHCPD_ATTR_MAINDHCP] = { .name = "maindhcp", .type = BLOBMSG_TYPE_BOOL }, [ODHCPD_ATTR_LEASEFILE] = { .name = "leasefile", .type = BLOBMSG_TYPE_STRING }, [ODHCPD_ATTR_LEASETRIGGER] = { .name = "leasetrigger", .type = BLOBMSG_TYPE_STRING }, }; @@ -190,7 +188,7 @@ static void set_config(struct uci_section *s) uci_to_blob(&b, s, &odhcpd_attr_list); blobmsg_parse(odhcpd_attrs, ODHCPD_ATTR_MAX, tb, blob_data(b.head), blob_len(b.head)); - if ((c = tb[ODHCPD_ATTR_LEGACY])) + if ((c = tb[ODHCPD_ATTR_MAINDHCP])) config.legacy = blobmsg_get_bool(c); if ((c = tb[ODHCPD_ATTR_LEASEFILE])) { @@ -214,10 +212,12 @@ static int set_lease(struct uci_section *s) blobmsg_parse(lease_attrs, LEASE_ATTR_MAX, tb, blob_data(b.head), blob_len(b.head)); size_t hostlen = 1; - if ((c = tb[LEASE_ATTR_HOSTNAME])) + if ((c = tb[LEASE_ATTR_NAME])) hostlen = blobmsg_data_len(c); struct lease *lease = calloc(1, sizeof(*lease) + hostlen); + if (!lease) + goto err; if (hostlen > 1) memcpy(lease->hostname, blobmsg_get_string(c), hostlen); @@ -233,6 +233,9 @@ static int set_lease(struct uci_section *s) if ((c = tb[LEASE_ATTR_DUID])) { size_t duidlen = (blobmsg_data_len(c) - 1) / 2; lease->duid = malloc(duidlen); + if (!lease->duid) + goto err; + ssize_t len = odhcpd_unhexlify(lease->duid, duidlen, blobmsg_get_string(c)); @@ -251,8 +254,10 @@ static int set_lease(struct uci_section *s) return 0; err: - free(lease->duid); - free(lease); + if (lease) { + free(lease->duid); + free(lease); + } return -1; } @@ -271,6 +276,9 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr struct interface *iface = get_interface(name); if (!iface) { iface = calloc(1, sizeof(*iface)); + if (!iface) + return -1; + strncpy(iface->name, name, sizeof(iface->name) - 1); list_add(&iface->head, &interfaces); } @@ -294,6 +302,9 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if (ifname) strncpy(iface->ifname, ifname, sizeof(iface->ifname) - 1); + if ((iface->ifindex = if_nametoindex(iface->ifname)) <= 0) + return -1; + iface->inuse = true; if ((c = tb[IFACE_ATTR_DYNAMICDHCP])) @@ -348,6 +359,9 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr iface->upstream = realloc(iface->upstream, iface->upstream_len + blobmsg_data_len(cur)); + if (!iface->upstream) + goto err; + memcpy(iface->upstream + iface->upstream_len, blobmsg_get_string(cur), blobmsg_data_len(cur)); iface->upstream_len += blobmsg_data_len(cur); } @@ -396,10 +410,16 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if (inet_pton(AF_INET, blobmsg_get_string(cur), &addr4) == 1) { iface->dhcpv4_dns = realloc(iface->dhcpv4_dns, (++iface->dhcpv4_dns_cnt) * sizeof(*iface->dhcpv4_dns)); + if (!iface->dhcpv4_dns) + goto err; + iface->dhcpv4_dns[iface->dhcpv4_dns_cnt - 1] = addr4; } else if (inet_pton(AF_INET6, blobmsg_get_string(cur), &addr6) == 1) { iface->dns = realloc(iface->dns, (++iface->dns_cnt) * sizeof(*iface->dns)); + if (!iface->dns) + goto err; + iface->dns[iface->dns_cnt - 1] = addr6; } else { goto err; @@ -421,14 +441,14 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr goto err; iface->search = realloc(iface->search, iface->search_len + len); + if (!iface->search) + goto err; + memcpy(&iface->search[iface->search_len], buf, len); iface->search_len += len; } } - if ((c = tb[IFACE_ATTR_ULA_COMPAT])) - iface->deprecate_ula_if_public_avail = blobmsg_get_bool(c); - if ((c = tb[IFACE_ATTR_RA_DEFAULT])) iface->default_router = blobmsg_get_u32(c); @@ -453,6 +473,8 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr if ((c = tb[IFACE_ATTR_NDPROXY_ROUTING])) iface->learn_routes = blobmsg_get_bool(c); + else + iface->learn_routes = true; if ((c = tb[IFACE_ATTR_NDPROXY_SLAVE])) iface->external = blobmsg_get_bool(c); @@ -467,12 +489,14 @@ int config_parse_interface(void *data, size_t len, const char *name, bool overwr int len = blobmsg_data_len(cur); iface->static_ndp = realloc(iface->static_ndp, iface->static_ndp_len + len); + if (!iface->static_ndp) + goto err; + memcpy(&iface->static_ndp[iface->static_ndp_len], blobmsg_get_string(cur), len); iface->static_ndp_len += len; } } - iface->ignore = (iface->ifindex = if_nametoindex(iface->ifname)) < 0; return 0; err: @@ -499,6 +523,10 @@ void odhcpd_reload(void) } struct interface *master = NULL, *i, *n; + + if (!uci) + return; + list_for_each_entry(i, &interfaces, head) clean_interface(i); @@ -507,7 +535,7 @@ void odhcpd_reload(void) struct uci_element *e; uci_foreach_element(&dhcp->sections, e) { struct uci_section *s = uci_to_section(e); - if (!strcmp(s->type, "lease")) + if (!strcmp(s->type, "host")) set_lease(s); else if (!strcmp(s->type, "odhcpd")) set_config(s); @@ -532,7 +560,7 @@ void odhcpd_reload(void) enum odhcpd_mode hybrid_mode = RELAYD_DISABLED; #ifdef WITH_UBUS - if (ubus_has_prefix(i->name, i->ifname)) + if (!ubus_has_prefix(i->name, i->ifname)) hybrid_mode = RELAYD_RELAY; #endif