From ab24039ff98e8d4814647d80de62ca62f04f991d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Feb 2019 21:30:06 +0100 Subject: [PATCH 1/7] networkd: wrap long log lines --- src/network/networkd-network.c | 132 ++++++++++++++++++++++----------- 1 file changed, 87 insertions(+), 45 deletions(-) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 4f3fb5d2d1..727b2da9f4 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -107,28 +107,34 @@ static int network_verify(Network *network) { if (network->bond) { /* Bonding slave does not support addressing. */ if (network->ipv6_accept_ra > 0) { - log_warning("%s: Cannot enable IPv6AcceptRA= when Bond= is specified, disabling IPv6AcceptRA=.", network->filename); + log_warning("%s: Cannot enable IPv6AcceptRA= when Bond= is specified, disabling IPv6AcceptRA=.", + network->filename); network->ipv6_accept_ra = 0; } if (network->link_local >= 0 && network->link_local != ADDRESS_FAMILY_NO) { - log_warning("%s: Cannot enable LinkLocalAddressing= when Bond= is specified, disabling LinkLocalAddressing=.", network->filename); + log_warning("%s: Cannot enable LinkLocalAddressing= when Bond= is specified, disabling LinkLocalAddressing=.", + network->filename); network->link_local = ADDRESS_FAMILY_NO; } if (network->dhcp != ADDRESS_FAMILY_NO) { - log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.", network->filename); + log_warning("%s: Cannot enable DHCP= when Bond= is specified, disabling DHCP=.", + network->filename); network->dhcp = ADDRESS_FAMILY_NO; } if (network->dhcp_server) { - log_warning("%s: Cannot enable DHCPServer= when Bond= is specified, disabling DHCPServer=.", network->filename); + log_warning("%s: Cannot enable DHCPServer= when Bond= is specified, disabling DHCPServer=.", + network->filename); network->dhcp_server = false; } if (network->n_static_addresses > 0) { - log_warning("%s: Cannot set addresses when Bond= is specified, ignoring addresses.", network->filename); + log_warning("%s: Cannot set addresses when Bond= is specified, ignoring addresses.", + network->filename); while ((address = network->static_addresses)) address_free(address); } if (network->n_static_routes > 0) { - log_warning("%s: Cannot set routes when Bond= is specified, ignoring routes.", network->filename); + log_warning("%s: Cannot set routes when Bond= is specified, ignoring routes.", + network->filename); while ((route = network->static_routes)) route_free(route); } @@ -599,18 +605,21 @@ int config_parse_netdev(const char *unit, kind = netdev_kind_from_string(kind_string); if (kind == _NETDEV_KIND_INVALID) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid NetDev kind: %s", lvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Invalid NetDev kind: %s", lvalue); return 0; } r = netdev_get(network->manager, rvalue, &netdev); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "%s could not be found, ignoring assignment: %s", lvalue, rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "%s could not be found, ignoring assignment: %s", lvalue, rvalue); return 0; } if (netdev->kind != kind) { - log_syntax(unit, LOG_ERR, filename, line, 0, "NetDev is not a %s, ignoring assignment: %s", lvalue, rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "NetDev is not a %s, ignoring assignment: %s", lvalue, rvalue); return 0; } @@ -690,7 +699,8 @@ int config_parse_domains( r = extract_first_word(&p, &w, NULL, 0); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract search or route domain, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract search or route domain, ignoring: %s", rvalue); break; } if (r == 0) @@ -700,21 +710,25 @@ int config_parse_domains( domain = is_route ? w + 1 : w; if (dns_name_is_root(domain) || streq(domain, "*")) { - /* If the root domain appears as is, or the special token "*" is found, we'll consider this as - * routing domain, unconditionally. */ + /* If the root domain appears as is, or the special token "*" is found, we'll + * consider this as routing domain, unconditionally. */ is_route = true; - domain = "."; /* make sure we don't allow empty strings, thus write the root domain as "." */ + domain = "."; /* make sure we don't allow empty strings, thus write the root + * domain as "." */ } else { r = dns_name_normalize(domain, 0, &normalized); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "'%s' is not a valid domain name, ignoring.", domain); + log_syntax(unit, LOG_ERR, filename, line, r, + "'%s' is not a valid domain name, ignoring.", domain); continue; } domain = normalized; if (is_localhost(domain)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "'localhost' domain names may not be configure as search or route domains, ignoring assignment: %s", domain); + log_syntax(unit, LOG_ERR, filename, line, 0, + "'localhost' domain may not be configured as search or route domain, ignoring assignment: %s", + domain); continue; } } @@ -754,7 +768,8 @@ int config_parse_tunnel(const char *unit, r = netdev_get(network->manager, rvalue, &netdev); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Tunnel is invalid, ignoring assignment: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Tunnel is invalid, ignoring assignment: %s", rvalue); return 0; } @@ -779,7 +794,8 @@ int config_parse_tunnel(const char *unit, r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add VLAN '%s' to network, ignoring: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Cannot add VLAN '%s' to network, ignoring: %m", rvalue); return 0; } @@ -854,7 +870,8 @@ int config_parse_dhcp( else if (streq(rvalue, "both")) s = ADDRESS_FAMILY_YES; else { - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DHCP option, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Failed to parse DHCP option, ignoring: %s", rvalue); return 0; } @@ -874,7 +891,8 @@ static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = { }; DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier, DHCPClientIdentifier); -DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DHCPClientIdentifier, "Failed to parse client identifier type"); +DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DHCPClientIdentifier, + "Failed to parse client identifier type"); int config_parse_ipv6token( const char* unit, @@ -899,17 +917,20 @@ int config_parse_ipv6token( r = in_addr_from_string(AF_INET6, rvalue, &buffer); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse IPv6 token, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to parse IPv6 token, ignoring: %s", rvalue); return 0; } if (in_addr_is_null(AF_INET6, &buffer)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 token cannot be the ANY address, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "IPv6 token cannot be the ANY address, ignoring: %s", rvalue); return 0; } if ((buffer.in6.s6_addr32[0] | buffer.in6.s6_addr32[1]) != 0) { - log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 token cannot be longer than 64 bits, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "IPv6 token cannot be longer than 64 bits, ignoring: %s", rvalue); return 0; } @@ -963,7 +984,8 @@ int config_parse_ipv6_privacy_extensions( if (streq(rvalue, "kernel")) s = _IPV6_PRIVACY_EXTENSIONS_INVALID; else { - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse IPv6 privacy extensions option, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Failed to parse IPv6 privacy extensions option, ignoring: %s", rvalue); return 0; } } @@ -999,17 +1021,20 @@ int config_parse_hostname( return r; if (!hostname_is_valid(hn, false)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not valid, ignoring assignment: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Hostname is not valid, ignoring assignment: %s", rvalue); return 0; } r = dns_name_is_valid(hn); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue); return 0; } if (r == 0) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not a valid DNS domain name, ignoring assignment: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Hostname is not a valid DNS domain name, ignoring assignment: %s", rvalue); return 0; } @@ -1041,7 +1066,8 @@ int config_parse_timezone( return r; if (!timezone_is_valid(tz, LOG_ERR)) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Timezone is not valid, ignoring assignment: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Timezone is not valid, ignoring assignment: %s", rvalue); return 0; } @@ -1076,14 +1102,16 @@ int config_parse_dhcp_server_dns( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract word, ignoring: %s", rvalue); return 0; } if (r == 0) break; if (inet_pton(AF_INET, w, &a) <= 0) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Failed to parse DNS server address, ignoring: %s", w); continue; } @@ -1126,7 +1154,8 @@ int config_parse_radv_dns( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract word, ignoring: %s", rvalue); return 0; } if (r == 0) @@ -1143,8 +1172,8 @@ int config_parse_radv_dns( n->router_dns = m; } else - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w); - + log_syntax(unit, LOG_ERR, filename, line, 0, + "Failed to parse DNS server address, ignoring: %s", w); } return 0; @@ -1177,7 +1206,8 @@ int config_parse_radv_search_domains( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract word, ignoring: %s", rvalue); return 0; } if (r == 0) @@ -1185,7 +1215,8 @@ int config_parse_radv_search_domains( r = dns_name_apply_idna(w, &idna); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to apply IDNA to domain name '%s', ignoring: %m", w); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to apply IDNA to domain name '%s', ignoring: %m", w); continue; } if (r > 0) { @@ -1230,14 +1261,16 @@ int config_parse_dhcp_server_ntp( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract word, ignoring: %s", rvalue); return 0; } if (r == 0) return 0; if (inet_pton(AF_INET, w, &a) <= 0) { - log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse NTP server address, ignoring: %s", w); + log_syntax(unit, LOG_ERR, filename, line, 0, + "Failed to parse NTP server address, ignoring: %s", w); continue; } @@ -1279,7 +1312,8 @@ int config_parse_dns( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Invalid syntax, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Invalid syntax, ignoring: %s", rvalue); break; } if (r == 0) @@ -1287,7 +1321,8 @@ int config_parse_dns( r = in_addr_from_string_auto(w, &family, &a); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse dns server address, ignoring: %s", w); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to parse dns server address, ignoring: %s", w); continue; } @@ -1336,7 +1371,8 @@ int config_parse_dnssec_negative_trust_anchors( r = extract_first_word(&p, &w, NULL, 0); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract negative trust anchor domain, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract negative trust anchor domain, ignoring: %s", rvalue); break; } if (r == 0) @@ -1344,7 +1380,8 @@ int config_parse_dnssec_negative_trust_anchors( r = dns_name_is_valid(w); if (r <= 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "%s is not a valid domain name, ignoring.", w); + log_syntax(unit, LOG_ERR, filename, line, r, + "%s is not a valid domain name, ignoring.", w); continue; } @@ -1393,7 +1430,8 @@ int config_parse_ntp( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract NTP server name, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to extract NTP server name, ignoring: %s", rvalue); break; } if (r == 0) @@ -1401,7 +1439,8 @@ int config_parse_ntp( r = dns_name_is_valid_or_address(w); if (r <= 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "%s is not a valid domain name or IP address, ignoring.", w); + log_syntax(unit, LOG_ERR, filename, line, r, + "%s is not a valid domain name or IP address, ignoring.", w); continue; } @@ -1446,14 +1485,16 @@ int config_parse_dhcp_user_class( if (r == -ENOMEM) return log_oom(); if (r < 0) { - log_syntax(unit, LOG_ERR, filename, line, r, "Failed to split user classes option, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to split user classes option, ignoring: %s", rvalue); break; } if (r == 0) break; if (strlen(w) > 255) { - log_syntax(unit, LOG_ERR, filename, line, r, "%s length is not in the range 1-255, ignoring.", w); + log_syntax(unit, LOG_ERR, filename, line, r, + "%s length is not in the range 1-255, ignoring.", w); continue; } @@ -1506,7 +1547,8 @@ int config_parse_section_route_table( return 0; } -DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, "Failed to parse DHCP use domains setting"); +DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, + "Failed to parse DHCP use domains setting"); static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = { [DHCP_USE_DOMAINS_NO] = "no", From 1b78172b5abe730227459fc4aa5aa3482a9778ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Feb 2019 22:12:48 +0100 Subject: [PATCH 2/7] test-ordered-set: add a copy of test-set adapted to OrderedSet --- src/test/meson.build | 4 +++ src/test/test-ordered-set.c | 72 +++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 src/test/test-ordered-set.c diff --git a/src/test/meson.build b/src/test/meson.build index 7537bdae34..86d8a30afa 100644 --- a/src/test/meson.build +++ b/src/test/meson.build @@ -440,6 +440,10 @@ tests += [ [], []], + [['src/test/test-ordered-set.c'], + [], + []], + [['src/test/test-set-disable-mempool.c'], [], [threads]], diff --git a/src/test/test-ordered-set.c b/src/test/test-ordered-set.c new file mode 100644 index 0000000000..d6a96a18cf --- /dev/null +++ b/src/test/test-ordered-set.c @@ -0,0 +1,72 @@ +/* SPDX-License-Identifier: LGPL-2.1+ */ + +#include "ordered-set.h" + +static void test_set_steal_first(void) { + _cleanup_ordered_set_free_ OrderedSet *m = NULL; + int seen[3] = {}; + char *val; + + m = ordered_set_new(&string_hash_ops); + assert_se(m); + + assert_se(ordered_set_put(m, (void*) "1") == 1); + assert_se(ordered_set_put(m, (void*) "22") == 1); + assert_se(ordered_set_put(m, (void*) "333") == 1); + + while ((val = ordered_set_steal_first(m))) + seen[strlen(val) - 1]++; + + assert_se(seen[0] == 1 && seen[1] == 1 && seen[2] == 1); + + assert_se(ordered_set_isempty(m)); +} + +typedef struct Item { + int seen; +} Item; +static void item_seen(Item *item) { + item->seen++; +} + +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops, void, trivial_hash_func, trivial_compare_func, Item, item_seen); + +static void test_set_free_with_hash_ops(void) { + OrderedSet *m; + struct Item items[4] = {}; + unsigned i; + + assert_se(m = ordered_set_new(&item_hash_ops)); + for (i = 0; i < ELEMENTSOF(items) - 1; i++) + assert_se(ordered_set_put(m, items + i) == 1); + + m = ordered_set_free(m); + assert_se(items[0].seen == 1); + assert_se(items[1].seen == 1); + assert_se(items[2].seen == 1); + assert_se(items[3].seen == 0); +} + +static void test_set_put(void) { + _cleanup_ordered_set_free_ OrderedSet *m = NULL; + + m = ordered_set_new(&string_hash_ops); + assert_se(m); + + assert_se(ordered_set_put(m, (void*) "1") == 1); + assert_se(ordered_set_put(m, (void*) "22") == 1); + assert_se(ordered_set_put(m, (void*) "333") == 1); + assert_se(ordered_set_put(m, (void*) "333") == 0); + assert_se(ordered_set_remove(m, (void*) "333")); + assert_se(ordered_set_put(m, (void*) "333") == 1); + assert_se(ordered_set_put(m, (void*) "333") == 0); + assert_se(ordered_set_put(m, (void*) "22") == 0); +} + +int main(int argc, const char *argv[]) { + test_set_steal_first(); + test_set_free_with_hash_ops(); + test_set_put(); + + return 0; +} From ef79eae09a4bfa8384aef2b9f466fb8dd5639f1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Feb 2019 22:29:20 +0100 Subject: [PATCH 3/7] basic/ordered-set: add functions to operate on OrderedSets of strings --- src/basic/ordered-set.c | 18 +++++++++++++++++ src/basic/ordered-set.h | 5 +++++ src/test/test-ordered-set.c | 39 +++++++++++++++++++++++++++++++++++++ src/test/test-set.c | 7 +++++++ 4 files changed, 69 insertions(+) diff --git a/src/basic/ordered-set.c b/src/basic/ordered-set.c index ed9ba776a4..5a4a637b68 100644 --- a/src/basic/ordered-set.c +++ b/src/basic/ordered-set.c @@ -45,3 +45,21 @@ int ordered_set_put_strdupv(OrderedSet *s, char **l) { return n; } + +int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l) { + int n = 0, r; + Iterator i; + char *p; + + /* Like ordered_set_put_strv, but for an OrderedSet of strings */ + + ORDERED_SET_FOREACH(p, l, i) { + r = ordered_set_put_strdup(s, p); + if (r < 0) + return r; + + n += r; + } + + return n; +} diff --git a/src/basic/ordered-set.h b/src/basic/ordered-set.h index 7cbb71819b..4a0a064557 100644 --- a/src/basic/ordered-set.h +++ b/src/basic/ordered-set.h @@ -48,9 +48,14 @@ static inline void* ordered_set_steal_first(OrderedSet *s) { return ordered_hashmap_steal_first((OrderedHashmap*) s); } +static inline char **ordered_set_get_strv(OrderedSet *s) { + return internal_hashmap_get_strv(HASHMAP_BASE((OrderedHashmap*) s)); +} + int ordered_set_consume(OrderedSet *s, void *p); int ordered_set_put_strdup(OrderedSet *s, const char *p); int ordered_set_put_strdupv(OrderedSet *s, char **l); +int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l); #define ORDERED_SET_FOREACH(e, s, i) \ for ((i) = ITERATOR_FIRST; ordered_set_iterate((s), &(i), (void**)&(e)); ) diff --git a/src/test/test-ordered-set.c b/src/test/test-ordered-set.c index d6a96a18cf..45b0357319 100644 --- a/src/test/test-ordered-set.c +++ b/src/test/test-ordered-set.c @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include "ordered-set.h" +#include "string-util.h" +#include "strv.h" static void test_set_steal_first(void) { _cleanup_ordered_set_free_ OrderedSet *m = NULL; @@ -49,6 +51,7 @@ static void test_set_free_with_hash_ops(void) { static void test_set_put(void) { _cleanup_ordered_set_free_ OrderedSet *m = NULL; + _cleanup_free_ char **t = NULL; m = ordered_set_new(&string_hash_ops); assert_se(m); @@ -61,12 +64,48 @@ static void test_set_put(void) { assert_se(ordered_set_put(m, (void*) "333") == 1); assert_se(ordered_set_put(m, (void*) "333") == 0); assert_se(ordered_set_put(m, (void*) "22") == 0); + + assert_se(t = ordered_set_get_strv(m)); + assert_se(streq(t[0], "1")); + assert_se(streq(t[1], "22")); + assert_se(streq(t[2], "333")); + assert_se(!t[3]); +} + +static void test_set_put_string_set(void) { + _cleanup_ordered_set_free_free_ OrderedSet *m = NULL; + _cleanup_ordered_set_free_ OrderedSet *q = NULL; + _cleanup_free_ char **final = NULL; /* "just free" because the strings are in the set */ + void *t; + + m = ordered_set_new(&string_hash_ops); + assert_se(m); + + q = ordered_set_new(&string_hash_ops); + assert_se(q); + + assert_se(t = strdup("1")); + assert_se(ordered_set_put(m, t) == 1); + assert_se(t = strdup("22")); + assert_se(ordered_set_put(m, t) == 1); + assert_se(t = strdup("333")); + assert_se(ordered_set_put(m, t) == 1); + + assert_se(ordered_set_put(q, (void*) "11") == 1); + assert_se(ordered_set_put(q, (void*) "22") == 1); + assert_se(ordered_set_put(q, (void*) "33") == 1); + + assert_se(ordered_set_put_string_set(m, q) == 2); + + assert_se(final = ordered_set_get_strv(m)); + assert_se(strv_equal(final, STRV_MAKE("1", "22", "333", "11", "33"))); } int main(int argc, const char *argv[]) { test_set_steal_first(); test_set_free_with_hash_ops(); test_set_put(); + test_set_put_string_set(); return 0; } diff --git a/src/test/test-set.c b/src/test/test-set.c index 340edeb65f..b4e7a52fd9 100644 --- a/src/test/test-set.c +++ b/src/test/test-set.c @@ -1,6 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #include "set.h" +#include "strv.h" static void test_set_steal_first(void) { _cleanup_set_free_ Set *m = NULL; @@ -77,6 +78,12 @@ static void test_set_put(void) { assert_se(set_put(m, (void*) "333") == 1); assert_se(set_put(m, (void*) "333") == 0); assert_se(set_put(m, (void*) "22") == 0); + + _cleanup_free_ char **t = set_get_strv(m); + assert_se(strv_contains(t, "1")); + assert_se(strv_contains(t, "22")); + assert_se(strv_contains(t, "333")); + assert_se(strv_length(t) == 3); } int main(int argc, const char *argv[]) { From 53ae3f6467b48aa89cff3ec22a54e7e164681f01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Feb 2019 22:39:47 +0100 Subject: [PATCH 4/7] basic/ordered-set: export networkd function to print string sets Tests are added. --- src/basic/ordered-set.c | 17 +++++++++++++++++ src/basic/ordered-set.h | 3 +++ src/network/networkd-manager.c | 24 ++++-------------------- src/test/test-ordered-set.c | 10 ++++++++++ 4 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/basic/ordered-set.c b/src/basic/ordered-set.c index 5a4a637b68..7fdb47e064 100644 --- a/src/basic/ordered-set.c +++ b/src/basic/ordered-set.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include "fileio.h" #include "ordered-set.h" #include "strv.h" @@ -63,3 +64,19 @@ int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l) { return n; } + +void ordered_set_print(FILE *f, const char *field, OrderedSet *s) { + bool space = false; + Iterator i; + char *p; + + if (ordered_set_isempty(s)) + return; + + fputs(field, f); + + ORDERED_SET_FOREACH(p, s, i) + fputs_with_space(f, p, NULL, &space); + + fputc('\n', f); +} diff --git a/src/basic/ordered-set.h b/src/basic/ordered-set.h index 4a0a064557..61107eb148 100644 --- a/src/basic/ordered-set.h +++ b/src/basic/ordered-set.h @@ -1,6 +1,8 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ #pragma once +#include + #include "hashmap.h" typedef struct OrderedSet OrderedSet; @@ -56,6 +58,7 @@ int ordered_set_consume(OrderedSet *s, void *p); int ordered_set_put_strdup(OrderedSet *s, const char *p); int ordered_set_put_strdupv(OrderedSet *s, char **l); int ordered_set_put_string_set(OrderedSet *s, OrderedSet *l); +void ordered_set_print(FILE *f, const char *field, OrderedSet *s); #define ORDERED_SET_FOREACH(e, s, i) \ for ((i) = ITERATOR_FIRST; ordered_set_iterate((s), &(i), (void**)&(e)); ) diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index b7e15a5699..758132d39d 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -1059,22 +1059,6 @@ static int ordered_set_put_in4_addrv(OrderedSet *s, return c; } -static void print_string_set(FILE *f, const char *field, OrderedSet *s) { - bool space = false; - Iterator i; - char *p; - - if (ordered_set_isempty(s)) - return; - - fputs(field, f); - - ORDERED_SET_FOREACH(p, s, i) - fputs_with_space(f, p, NULL, &space); - - fputc('\n', f); -} - static int manager_save(Manager *m) { _cleanup_ordered_set_free_free_ OrderedSet *dns = NULL, *ntp = NULL, *search_domains = NULL, *route_domains = NULL; Link *link; @@ -1197,10 +1181,10 @@ static int manager_save(Manager *m) { "# This is private data. Do not parse.\n" "OPER_STATE=%s\n", operstate_str); - print_string_set(f, "DNS=", dns); - print_string_set(f, "NTP=", ntp); - print_string_set(f, "DOMAINS=", search_domains); - print_string_set(f, "ROUTE_DOMAINS=", route_domains); + ordered_set_print(f, "DNS=", dns); + ordered_set_print(f, "NTP=", ntp); + ordered_set_print(f, "DOMAINS=", search_domains); + ordered_set_print(f, "ROUTE_DOMAINS=", route_domains); r = routing_policy_serialize_rules(m->rules, f); if (r < 0) diff --git a/src/test/test-ordered-set.c b/src/test/test-ordered-set.c index 45b0357319..0d29fcfad2 100644 --- a/src/test/test-ordered-set.c +++ b/src/test/test-ordered-set.c @@ -1,5 +1,7 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ +#include + #include "ordered-set.h" #include "string-util.h" #include "strv.h" @@ -16,12 +18,16 @@ static void test_set_steal_first(void) { assert_se(ordered_set_put(m, (void*) "22") == 1); assert_se(ordered_set_put(m, (void*) "333") == 1); + ordered_set_print(stdout, "SET=", m); + while ((val = ordered_set_steal_first(m))) seen[strlen(val) - 1]++; assert_se(seen[0] == 1 && seen[1] == 1 && seen[2] == 1); assert_se(ordered_set_isempty(m)); + + ordered_set_print(stdout, "SET=", m); } typedef struct Item { @@ -70,6 +76,8 @@ static void test_set_put(void) { assert_se(streq(t[1], "22")); assert_se(streq(t[2], "333")); assert_se(!t[3]); + + ordered_set_print(stdout, "FOO=", m); } static void test_set_put_string_set(void) { @@ -99,6 +107,8 @@ static void test_set_put_string_set(void) { assert_se(final = ordered_set_get_strv(m)); assert_se(strv_equal(final, STRV_MAKE("1", "22", "333", "11", "33"))); + + ordered_set_print(stdout, "BAR=", m); } int main(int argc, const char *argv[]) { From 5e2a51d588dde4b52c6017ea80b75c16e6e23431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Wed, 20 Feb 2019 22:50:25 +0100 Subject: [PATCH 5/7] networkd: use OrderedSets instead of strvs to store lists of domains We were already using OrderedSets in the manager object, but strvs in the configuration parsing code. Using sets gives us better scaling when many domains are used. In oss-fuzz #13059 the attached reproducer takes approximately 30.5 s to be parsed. Converting to sets makes this go down to 10s. This is not _vastly_ faster, but using sets seems like a nicer approach anyway. In particular, we avoid the quadratic de-unification operation after each addition. --- src/network/networkd-link.c | 8 +--- src/network/networkd-manager.c | 4 +- src/network/networkd-network.c | 48 +++++++++---------- src/network/networkd-network.h | 6 ++- src/network/networkd-radv.c | 9 +++- test/fuzz/fuzz-network-parser/oss-fuzz-13059 | Bin 0 -> 407131 bytes 6 files changed, 39 insertions(+), 36 deletions(-) create mode 100644 test/fuzz/fuzz-network-parser/oss-fuzz-13059 diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 2aea0b839c..8418d66089 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -4083,9 +4083,7 @@ int link_save(Link *link) { (void) sd_dhcp6_lease_get_domains(dhcp6_lease, &dhcp6_domains); } - fputs("DOMAINS=", f); - space = false; - fputstrv(f, link->network->search_domains, NULL, &space); + ordered_set_print(f, "DOMAINS=", link->network->search_domains); if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_YES) { NDiscDNSSL *dd; @@ -4103,9 +4101,7 @@ int link_save(Link *link) { fputc('\n', f); - fputs("ROUTE_DOMAINS=", f); - space = false; - fputstrv(f, link->network->route_domains, NULL, &space); + ordered_set_print(f, "ROUTE_DOMAINS=", link->network->route_domains); if (link->network->dhcp_use_domains == DHCP_USE_DOMAINS_ROUTE) { NDiscDNSSL *dd; diff --git a/src/network/networkd-manager.c b/src/network/networkd-manager.c index 758132d39d..8ee7bca435 100644 --- a/src/network/networkd-manager.c +++ b/src/network/networkd-manager.c @@ -1108,11 +1108,11 @@ static int manager_save(Manager *m) { if (r < 0) return r; - r = ordered_set_put_strdupv(search_domains, link->network->search_domains); + r = ordered_set_put_string_set(search_domains, link->network->search_domains); if (r < 0) return r; - r = ordered_set_put_strdupv(route_domains, link->network->route_domains); + r = ordered_set_put_string_set(route_domains, link->network->route_domains); if (r < 0) return r; diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 727b2da9f4..a83df49038 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -385,11 +385,11 @@ void network_free(Network *network) { strv_free(network->ntp); free(network->dns); - strv_free(network->search_domains); - strv_free(network->route_domains); + ordered_set_free_free(network->search_domains); + ordered_set_free_free(network->route_domains); strv_free(network->bind_carrier); - strv_free(network->router_search_domains); + ordered_set_free_free(network->router_search_domains); free(network->router_dns); netdev_unref(network->bridge); @@ -553,8 +553,8 @@ int network_apply(Network *network, Link *link) { if (network->n_dns > 0 || !strv_isempty(network->ntp) || - !strv_isempty(network->search_domains) || - !strv_isempty(network->route_domains)) + !ordered_set_isempty(network->search_domains) || + !ordered_set_isempty(network->route_domains)) link_dirty(link); return 0; @@ -686,8 +686,8 @@ int config_parse_domains( assert(rvalue); if (isempty(rvalue)) { - n->search_domains = strv_free(n->search_domains); - n->route_domains = strv_free(n->route_domains); + n->search_domains = ordered_set_free_free(n->search_domains); + n->route_domains = ordered_set_free_free(n->route_domains); return 0; } @@ -733,17 +733,16 @@ int config_parse_domains( } } - if (is_route) - r = strv_extend(&n->route_domains, domain); - else - r = strv_extend(&n->search_domains, domain); + OrderedSet **set = is_route ? &n->route_domains : &n->search_domains; + r = ordered_set_ensure_allocated(set, &string_hash_ops); + if (r < 0) + return r; + + r = ordered_set_put_strdup(*set, domain); if (r < 0) return log_oom(); } - strv_uniq(n->route_domains); - strv_uniq(n->search_domains); - return 0; } @@ -1218,16 +1217,17 @@ int config_parse_radv_search_domains( log_syntax(unit, LOG_ERR, filename, line, r, "Failed to apply IDNA to domain name '%s', ignoring: %m", w); continue; - } - if (r > 0) { - r = strv_push(&n->router_search_domains, idna); - if (r >= 0) - idna = NULL; - } else { - r = strv_push(&n->router_search_domains, w); - if (r >= 0) - w = NULL; - } + } else if (r == 0) + /* transfer ownership to simplify subsequent operations */ + idna = TAKE_PTR(w); + + r = ordered_set_ensure_allocated(&n->router_search_domains, &string_hash_ops); + if (r < 0) + return r; + + r = ordered_set_consume(n->router_search_domains, TAKE_PTR(idna)); + if (r < 0) + return r; } return 0; diff --git a/src/network/networkd-network.h b/src/network/networkd-network.h index e61c391c76..5681e8d212 100644 --- a/src/network/networkd-network.h +++ b/src/network/networkd-network.h @@ -20,6 +20,7 @@ #include "networkd-route.h" #include "networkd-routing-policy-rule.h" #include "networkd-util.h" +#include "ordered-set.h" #include "resolve-util.h" #define DHCP_ROUTE_METRIC 1024 @@ -173,7 +174,7 @@ struct Network { usec_t router_dns_lifetime_usec; struct in6_addr *router_dns; unsigned n_router_dns; - char **router_search_domains; + OrderedSet *router_search_domains; bool dhcp6_force_pd_other_information; /* Start DHCPv6 PD also when 'O' RA flag is set, see RFC 7084, WPD-4 */ @@ -267,7 +268,8 @@ struct Network { /* All kinds of DNS configuration */ struct in_addr_data *dns; unsigned n_dns; - char **search_domains, **route_domains; + OrderedSet *search_domains, *route_domains; + int dns_default_route; ResolveSupport llmnr; ResolveSupport mdns; diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 92cead052a..ecf984e226 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -391,8 +391,9 @@ static int radv_set_dns(Link *link, Link *uplink) { } static int radv_set_domains(Link *link, Link *uplink) { - char **search_domains; + OrderedSet *search_domains; usec_t lifetime_usec; + _cleanup_free_ char **s = NULL; /* just free() because the strings are owned by the set */ if (!link->network->router_emit_domains) return 0; @@ -423,9 +424,13 @@ static int radv_set_domains(Link *link, Link *uplink) { return 0; set_domains: + s = ordered_set_get_strv(search_domains); + if (!s) + return log_oom(); + return sd_radv_set_dnssl(link->radv, DIV_ROUND_UP(lifetime_usec, USEC_PER_SEC), - search_domains); + s); } diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-13059 b/test/fuzz/fuzz-network-parser/oss-fuzz-13059 new file mode 100644 index 0000000000000000000000000000000000000000..a605c791700dc6c2da6120c686a2a09c72b6d1c6 GIT binary patch literal 407131 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 Date: Thu, 21 Feb 2019 10:04:23 +0100 Subject: [PATCH 6/7] shared/hashmap: trivial style updates --- src/basic/hashmap.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/basic/hashmap.c b/src/basic/hashmap.c index 66e9e0046b..24bdc33cec 100644 --- a/src/basic/hashmap.c +++ b/src/basic/hashmap.c @@ -1536,7 +1536,6 @@ void *internal_hashmap_first_key_and_value(HashmapBase *h, bool remove, void **r } unsigned internal_hashmap_size(HashmapBase *h) { - if (!h) return 0; @@ -1544,7 +1543,6 @@ unsigned internal_hashmap_size(HashmapBase *h) { } unsigned internal_hashmap_buckets(HashmapBase *h) { - if (!h) return 0; @@ -1904,8 +1902,7 @@ IteratedCache *iterated_cache_free(IteratedCache *cache) { if (cache) { free(cache->keys.ptr); free(cache->values.ptr); - free(cache); } - return NULL; + return mfree(cache); } From 95b2903bdea5a5aaf1ba4b0c76a6664c790f1b93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 Feb 2019 12:30:13 +0100 Subject: [PATCH 7/7] tests: shorten the fuzz test case The test was failing in Ubuntu CI with a 30s timeout. It makes sense to keep the file so exercise the set allocation logic, but we can make it shorter. --- test/fuzz/fuzz-network-parser/oss-fuzz-13059 | Bin 407131 -> 6558 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/fuzz/fuzz-network-parser/oss-fuzz-13059 b/test/fuzz/fuzz-network-parser/oss-fuzz-13059 index a605c791700dc6c2da6120c686a2a09c72b6d1c6..d4267ffc0e39e4f3e76980d3888b89cfb8fc5b30 100644 GIT binary patch delta 8 PcmccpMq-}vhIx_z6)OZ7 delta 6452 zcmbPdeEW^WhIx{c0~lE*%dk0Z=HcXJVpN)ZmstYJoy0wP1E>0AUpB$XJe)e4_w(H6 zK~g+P0Eu&wb+aJHZ|2DhnZhTZAk+e{pFu zO^)VvoxGoC(I|H`G)5D{XkHjC3Pwx9(UNeqBpfXXM@z!dl5n&n94!e)OTy8TaI_>G zEeS_U!qJj&v?LrY2}eu9K~NG-{>Alc@<;ZR(cx>HqxVbrh?*AI#KM>}*^x~aI8E`N zZ?g=iJ1a}30&Do@|J?I=aT%a3Ad#4;lbDzo55%Zo@A F2mqP@6u|%h