From a27060759bcdbf35a03a883a121838b8d281da20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 May 2020 07:40:31 +0200 Subject: [PATCH 1/5] network: fix signed/unsigned confusion sd_dhcp_lease_get_servers() returns int, which would never be negative when cast to size_t, so we condition check was wrong. CID#1425417. --- src/network/networkd-dhcp-server.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index 2e9cef590f..87659909a0 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -160,12 +160,12 @@ static int link_push_uplink_to_dhcp_server( if (lease_condition && link->dhcp_lease) { const struct in_addr *da; - size_t n = sd_dhcp_lease_get_servers(link->dhcp_lease, what, &da); + int n = sd_dhcp_lease_get_servers(link->dhcp_lease, what, &da); if (n > 0) { if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + n)) return log_oom(); - for (unsigned i = 0; i < n; i++) + for (int i = 0; i < n; i++) if (in4_addr_is_non_local(&da[i])) addresses[n_addresses++] = da[i]; } From 5dc31db7c16873fac714d28ac2fa072eb8642d88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 May 2020 07:41:30 +0200 Subject: [PATCH 2/5] network: reduce scope of variables, etc. --- src/network/networkd-dhcp-server.c | 34 ++++++++++-------------------- 1 file changed, 11 insertions(+), 23 deletions(-) diff --git a/src/network/networkd-dhcp-server.c b/src/network/networkd-dhcp-server.c index 87659909a0..3427c6642a 100644 --- a/src/network/networkd-dhcp-server.c +++ b/src/network/networkd-dhcp-server.c @@ -21,24 +21,15 @@ static Address* link_find_dhcp_server_address(Link *link) { assert(link->network); /* The first statically configured address if there is any */ - LIST_FOREACH(addresses, address, link->network->static_addresses) { - - if (address->family != AF_INET) - continue; - - if (in_addr_is_null(address->family, &address->in_addr)) - continue; - - return address; - } + LIST_FOREACH(addresses, address, link->network->static_addresses) + if (address->family == AF_INET && + !in_addr_is_null(address->family, &address->in_addr)) + return address; /* If that didn't work, find a suitable address we got from the pool */ - LIST_FOREACH(addresses, address, link->pool_addresses) { - if (address->family != AF_INET) - continue; - - return address; - } + LIST_FOREACH(addresses, address, link->pool_addresses) + if (address->family == AF_INET) + return address; return NULL; } @@ -46,9 +37,8 @@ static Address* link_find_dhcp_server_address(Link *link) { static int link_push_uplink_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) { _cleanup_free_ struct in_addr *addresses = NULL; size_t n_addresses = 0, n_allocated = 0; - unsigned i; - for (i = 0; i < link->network->n_dns; i++) { + for (unsigned i = 0; i < link->network->n_dns; i++) { struct in_addr ia; /* Only look for IPv4 addresses */ @@ -68,16 +58,14 @@ static int link_push_uplink_dns_to_dhcp_server(Link *link, sd_dhcp_server *s) { } if (link->network->dhcp_use_dns && link->dhcp_lease) { - const struct in_addr *da = NULL; - int j, n; + const struct in_addr *da; - n = sd_dhcp_lease_get_dns(link->dhcp_lease, &da); + int n = sd_dhcp_lease_get_dns(link->dhcp_lease, &da); if (n > 0) { - if (!GREEDY_REALLOC(addresses, n_allocated, n_addresses + n)) return log_oom(); - for (j = 0; j < n; j++) + for (int j = 0; j < n; j++) if (in4_addr_is_non_local(&da[j])) addresses[n_addresses++] = da[j]; } From f1983039021391d6a42e06e0bd2e7dcc0914bbc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 May 2020 07:51:33 +0200 Subject: [PATCH 3/5] sd-path: fix systemd-system-generator-path lookup CID#1422164. --- src/libsystemd/sd-path/sd-path.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libsystemd/sd-path/sd-path.c b/src/libsystemd/sd-path/sd-path.c index 2a9c04a84d..9f8397cd37 100644 --- a/src/libsystemd/sd-path/sd-path.c +++ b/src/libsystemd/sd-path/sd-path.c @@ -624,7 +624,7 @@ static int get_search(uint64_t type, char ***list) { case SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH: case SD_PATH_SYSTEMD_USER_GENERATOR_PATH: { char **t; - const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_UNIT_PATH ? + const UnitFileScope scope = type == SD_PATH_SYSTEMD_SYSTEM_GENERATOR_PATH ? UNIT_FILE_SYSTEM : UNIT_FILE_USER; t = generator_binary_paths(scope); From d27357966707b6da940008db8c7a9e263a6897aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 May 2020 08:17:45 +0200 Subject: [PATCH 4/5] network: use consistent type when parsing lifetimes Those fields are both uint32_t, so we should use the same type when parsing. Having a different type didn't change the result, but let's be consistent. --- src/network/networkd-address.c | 4 ++-- src/network/networkd-dhcp4.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 1567bd7ee9..f9bbd05dd8 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -954,7 +954,7 @@ int config_parse_lifetime(const char *unit, void *userdata) { Network *network = userdata; _cleanup_(address_free_or_set_invalidp) Address *n = NULL; - unsigned k; + uint32_t k; int r; assert(filename); @@ -979,7 +979,7 @@ int config_parse_lifetime(const char *unit, } n->cinfo.ifa_prefered = k; - n = NULL; + TAKE_PTR(n); return 0; } diff --git a/src/network/networkd-dhcp4.c b/src/network/networkd-dhcp4.c index 42e6b5aef2..8e2c775fcf 100644 --- a/src/network/networkd-dhcp4.c +++ b/src/network/networkd-dhcp4.c @@ -1691,7 +1691,7 @@ int config_parse_dhcp_fallback_lease_lifetime(const char *unit, void *data, void *userdata) { Network *network = userdata; - unsigned k; + uint32_t k; assert(filename); assert(section); From 10b20e5a936e28de47b8c42fab8d73bce528fa8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 21 May 2020 08:36:01 +0200 Subject: [PATCH 5/5] network: allow empty assignment to PreferredLifetime= Users might want to use that to unset a previous setting. The docs seem OK as they are: we don't need to explictly mention the empty value, since it is almost always allowed. --- src/network/networkd-address.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index f9bbd05dd8..9b78530334 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -967,8 +967,8 @@ int config_parse_lifetime(const char *unit, if (r < 0) return r; - /* We accept only "forever", "infinity", or "0". */ - if (STR_IN_SET(rvalue, "forever", "infinity")) + /* We accept only "forever", "infinity", empty, or "0". */ + if (STR_IN_SET(rvalue, "forever", "infinity", "")) k = CACHE_INFO_INFINITY_LIFE_TIME; else if (streq(rvalue, "0")) k = 0;