From 634815762d837e25ed4640cb8a12fa742a13d9ac Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Aug 2021 12:41:34 +0900 Subject: [PATCH 1/3] network: rebreak conf parser arguments --- src/network/netdev/geneve.c | 88 ++++++++++++---------- src/network/netdev/tunnel.c | 117 ++++++++++++++++------------- src/network/netdev/vxlan.c | 88 ++++++++++++---------- src/network/networkd-dhcp-common.c | 21 +++--- src/network/networkd-dhcp4.c | 4 +- src/network/networkd-network.c | 4 +- 6 files changed, 176 insertions(+), 146 deletions(-) diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index b0baa53edc..1bffbc9586 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -164,16 +164,18 @@ static int netdev_geneve_create(NetDev *netdev) { return r; } -int config_parse_geneve_vni(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_geneve_vni( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Geneve *v = userdata; uint32_t f; int r; @@ -199,16 +201,18 @@ int config_parse_geneve_vni(const char *unit, return 0; } -int config_parse_geneve_address(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_geneve_address( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Geneve *v = userdata; union in_addr_union *addr = data, buffer; int r, f; @@ -236,16 +240,18 @@ int config_parse_geneve_address(const char *unit, return 0; } -int config_parse_geneve_flow_label(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_geneve_flow_label( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Geneve *v = userdata; uint32_t f; int r; @@ -272,16 +278,18 @@ int config_parse_geneve_flow_label(const char *unit, return 0; } -int config_parse_geneve_ttl(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_geneve_ttl( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Geneve *v = userdata; unsigned f; int r; diff --git a/src/network/netdev/tunnel.c b/src/network/netdev/tunnel.c index f27a1e4335..cae2ef1a90 100644 --- a/src/network/netdev/tunnel.c +++ b/src/network/netdev/tunnel.c @@ -501,16 +501,18 @@ static int netdev_tunnel_verify(NetDev *netdev, const char *filename) { return 0; } -int config_parse_tunnel_address(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_tunnel_address( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Tunnel *t = userdata; union in_addr_union *addr = data, buffer; int r, f; @@ -555,16 +557,18 @@ int config_parse_tunnel_address(const char *unit, return 0; } -int config_parse_tunnel_key(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_tunnel_key( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + union in_addr_union buffer; Tunnel *t = userdata; uint32_t k; @@ -596,16 +600,18 @@ int config_parse_tunnel_key(const char *unit, return 0; } -int config_parse_ipv6_flowlabel(const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_ipv6_flowlabel( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + IPv6FlowLabel *ipv6_flowlabel = data; Tunnel *t = userdata; int k = 0; @@ -635,16 +641,18 @@ int config_parse_ipv6_flowlabel(const char* unit, return 0; } -int config_parse_encap_limit(const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_encap_limit( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Tunnel *t = userdata; int k = 0; int r; @@ -673,26 +681,27 @@ int config_parse_encap_limit(const char* unit, return 0; } -int config_parse_6rd_prefix(const char* unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_6rd_prefix( + const char* unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + Tunnel *t = userdata; + union in_addr_union p; + uint8_t l; + int r; assert(filename); assert(lvalue); assert(rvalue); - union in_addr_union p; - uint8_t l; - int r; - r = in_addr_prefix_from_string(rvalue, AF_INET6, &p, &l); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse 6rd prefix \"%s\", ignoring: %m", rvalue); diff --git a/src/network/netdev/vxlan.c b/src/network/netdev/vxlan.c index 52d8b3736c..6829017f80 100644 --- a/src/network/netdev/vxlan.c +++ b/src/network/netdev/vxlan.c @@ -174,16 +174,18 @@ static int netdev_vxlan_fill_message_create(NetDev *netdev, Link *link, sd_netli return r; } -int config_parse_vxlan_address(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_vxlan_address( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + VxLan *v = userdata; union in_addr_union *addr = data, buffer; int r, f; @@ -225,16 +227,18 @@ int config_parse_vxlan_address(const char *unit, return 0; } -int config_parse_port_range(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_port_range( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + VxLan *v = userdata; uint16_t low, high; int r; @@ -257,16 +261,18 @@ int config_parse_port_range(const char *unit, return 0; } -int config_parse_flow_label(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_flow_label( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + VxLan *v = userdata; unsigned f; int r; @@ -293,16 +299,18 @@ int config_parse_flow_label(const char *unit, return 0; } -int config_parse_vxlan_ttl(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_vxlan_ttl( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + VxLan *v = userdata; unsigned f; int r; diff --git a/src/network/networkd-dhcp-common.c b/src/network/networkd-dhcp-common.c index 2b201e271e..19c888287c 100644 --- a/src/network/networkd-dhcp-common.c +++ b/src/network/networkd-dhcp-common.c @@ -460,16 +460,17 @@ int config_parse_section_route_table( return 0; } -int config_parse_iaid(const char *unit, - const char *filename, - unsigned line, - const char *section, - unsigned section_line, - const char *lvalue, - int ltype, - const char *rvalue, - void *data, - void *userdata) { +int config_parse_iaid( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { Network *network = userdata; uint32_t iaid; diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 12fb85bf90..0d0097f0d0 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1838,7 +1838,8 @@ int config_parse_dhcp_ip_service_type( return 0; } -int config_parse_dhcp_fallback_lease_lifetime(const char *unit, +int config_parse_dhcp_fallback_lease_lifetime( + const char *unit, const char *filename, unsigned line, const char *section, @@ -1848,6 +1849,7 @@ int config_parse_dhcp_fallback_lease_lifetime(const char *unit, const char *rvalue, void *data, void *userdata) { + Network *network = userdata; uint32_t k; diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index f16553a6d9..0f4b00992f 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -719,7 +719,8 @@ bool network_has_static_ipv6_configurations(Network *network) { return false; } -int config_parse_stacked_netdev(const char *unit, +int config_parse_stacked_netdev( + const char *unit, const char *filename, unsigned line, const char *section, @@ -729,6 +730,7 @@ int config_parse_stacked_netdev(const char *unit, const char *rvalue, void *data, void *userdata) { + _cleanup_free_ char *name = NULL; NetDevKind kind = ltype; Hashmap **h = data; From b40b8b06cbd25fa2b7e5fea8d55f1d1ab4f0dce4 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Aug 2021 12:48:04 +0900 Subject: [PATCH 2/3] network: check validity before copying the input string Prompted by https://github.com/systemd/systemd/pull/20440#discussion_r689136337. --- src/network/networkd-network.c | 35 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 0f4b00992f..5d287f7751 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -861,26 +861,26 @@ int config_parse_hostname( void *data, void *userdata) { - _cleanup_free_ char *hn = NULL; char **hostname = data; int r; assert(filename); assert(lvalue); assert(rvalue); - assert(hostname); + assert(data); - r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &hn, userdata); - if (r < 0) - return r; + if (isempty(rvalue)) { + *hostname = mfree(*hostname); + return 0; + } - if (!hostname_is_valid(hn, 0)) { + if (!hostname_is_valid(rvalue, 0)) { log_syntax(unit, LOG_WARNING, filename, line, 0, "Hostname is not valid, ignoring assignment: %s", rvalue); return 0; } - r = dns_name_is_valid(hn); + r = dns_name_is_valid(rvalue); if (r < 0) { log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to check validity of hostname '%s', ignoring assignment: %m", rvalue); @@ -892,7 +892,7 @@ int config_parse_hostname( return 0; } - return free_and_replace(*hostname, hn); + return free_and_strdup_warn(hostname, rvalue); } int config_parse_timezone( @@ -907,26 +907,27 @@ int config_parse_timezone( void *data, void *userdata) { - _cleanup_free_ char *tz = NULL; - char **datap = data; + char **tz = data; int r; assert(filename); assert(lvalue); assert(rvalue); - assert(datap); + assert(data); - r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &tz, userdata); - if (r < 0) - return r; + if (isempty(rvalue)) { + *tz = mfree(*tz); + return 0; + } - if (!timezone_is_valid(tz, LOG_WARNING)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, + r = verify_timezone(rvalue, LOG_WARNING); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, "Timezone is not valid, ignoring assignment: %s", rvalue); return 0; } - return free_and_replace(*datap, tz); + return free_and_strdup_warn(tz, rvalue); } int config_parse_dns( From 80e41a68d62dd662e4453de6a36d7f10a62ee33c Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 16 Aug 2021 12:57:18 +0900 Subject: [PATCH 3/3] man: address label can be set only for IPv4 addresses --- man/systemd.network.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/man/systemd.network.xml b/man/systemd.network.xml index 299c56df0a..f34f3025cb 100644 --- a/man/systemd.network.xml +++ b/man/systemd.network.xml @@ -1053,7 +1053,8 @@ IPv6Token=prefixstable:2002:da8:1:: Label= - An address label. + Specifies the label for the IPv4 address. The label must be a 7-bit ASCII string with + a length of 1…15 characters. Defaults to unset.