diff --git a/docs/USER_RECORD.md b/docs/USER_RECORD.md index 885a94858d..877d213e46 100644 --- a/docs/USER_RECORD.md +++ b/docs/USER_RECORD.md @@ -368,11 +368,11 @@ directory is first created, and defaults to `/etc/skel` if not defined. access mask for the home directory when it is first created. `tasksMax` → Takes an unsigned 64bit integer indicating the maximum number of -tasks the user may start in parallel during system runtime. This value is -enforced on all tasks (i.e. processes and threads) the user starts or that are -forked off these processes regardless if the change user identity (for example -by setuid binaries/`su`/`sudo` and -similar). [`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html) +tasks the user may start in parallel during system runtime. This counts +all tasks (i.e. threads, where each process is at least one thread) the user starts or that are +forked from these processes even if the user identity is changed (for example +by setuid binaries/`su`/`sudo` and similar). +[`systemd-logind.service`](https://www.freedesktop.org/software/systemd/man/systemd-logind.service.html) enforces this by setting the `TasksMax` slice property for the user's slice `user-$UID.slice`. diff --git a/man/homectl.xml b/man/homectl.xml index ad59c174e0..6a8448f25d 100644 --- a/man/homectl.xml +++ b/man/homectl.xml @@ -504,10 +504,10 @@ TASKS Takes a non-zero unsigned integer as argument. Configures the maximum numer of tasks - (i.e. processes and threads) the user may have at any given time. This limit applies to all tasks - forked off the user's sessions, even if they change user identity via su1 or a - similar tool. Use to place a limit on the tasks actually + (i.e. threads, where each process is at least one thread) the user may have at any given time. This + limit applies to all tasks forked off the user's sessions, even if they change user identity via + su1 + or a similar tool. Use to place a limit on the tasks actually running under the UID of the user, thus excluding any child processes that might have changed user identity. This controls the TasksMax= setting of the per-user systemd slice unit user-$UID.slice. See @@ -532,7 +532,7 @@ WEIGHT WEIGHT - Set a CPU and IO scheduling weights of the processes of the user, including those of + Set CPU and IO scheduling weights of the processes of the user, including those of processes forked off by the user that changed user credentials. Takes a numeric value in the range 1…10000. This controls the CPUWeight= and IOWeight= settings of the per-user systemd slice unit user-$UID.slice. See diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 4df5608719..053aa3b4ce 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -3450,7 +3450,6 @@ static int link_load(Link *link) { *dhcp4_address = NULL, *ipv4ll_address = NULL; union in_addr_union address; - const char *p; int r; assert(link); @@ -3489,107 +3488,100 @@ static int link_load(Link *link) { network_file_fail: - if (addresses) { - p = addresses; + for (const char *p = addresses; p; ) { + _cleanup_free_ char *address_str = NULL; + char *prefixlen_str; + int family; + unsigned char prefixlen; - for (;;) { - _cleanup_free_ char *address_str = NULL; - char *prefixlen_str; - int family; - unsigned char prefixlen; + r = extract_first_word(&p, &address_str, NULL, 0); + if (r < 0) + log_link_warning_errno(link, r, "failed to parse ADDRESSES: %m"); + if (r <= 0) + break; - r = extract_first_word(&p, &address_str, NULL, 0); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to extract next address string: %m"); - continue; - } - if (r == 0) - break; - - prefixlen_str = strchr(address_str, '/'); - if (!prefixlen_str) { - log_link_debug(link, "Failed to parse address and prefix length %s", address_str); - continue; - } - - *prefixlen_str++ = '\0'; - - r = sscanf(prefixlen_str, "%hhu", &prefixlen); - if (r != 1) { - log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str); - continue; - } - - r = in_addr_from_string_auto(address_str, &family, &address); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str); - continue; - } - - r = address_add(link, family, &address, prefixlen, NULL); - if (r < 0) - return log_link_error_errno(link, r, "Failed to add address: %m"); + prefixlen_str = strchr(address_str, '/'); + if (!prefixlen_str) { + log_link_debug(link, "Failed to parse address and prefix length %s", address_str); + continue; } + *prefixlen_str++ = '\0'; + + r = sscanf(prefixlen_str, "%hhu", &prefixlen); + if (r != 1) { + log_link_error(link, "Failed to parse prefixlen %s", prefixlen_str); + continue; + } + + r = in_addr_from_string_auto(address_str, &family, &address); + if (r < 0) { + log_link_debug_errno(link, r, "Failed to parse address %s: %m", address_str); + continue; + } + + r = address_add(link, family, &address, prefixlen, NULL); + if (r < 0) + return log_link_error_errno(link, r, "Failed to add address: %m"); } - if (routes) { - p = routes; + for (const char *p = routes; p; ) { + _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL; + _cleanup_(route_freep) Route *tmp = NULL; + _cleanup_free_ char *route_str = NULL; + char *prefixlen_str; + Route *route; - for (;;) { - _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL; - _cleanup_(route_freep) Route *tmp = NULL; - _cleanup_free_ char *route_str = NULL; - char *prefixlen_str; - Route *route; + r = extract_first_word(&p, &route_str, NULL, 0); + if (r < 0) + log_link_debug_errno(link, r, "failed to parse ROUTES: %m"); + if (r <= 0) + break; - r = extract_first_word(&p, &route_str, NULL, 0); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to extract next route string: %m"); - continue; - } - if (r == 0) - break; - - prefixlen_str = strchr(route_str, '/'); - if (!prefixlen_str) { - log_link_debug(link, "Failed to parse route %s", route_str); - continue; - } - - *prefixlen_str++ = '\0'; - - r = route_new(&tmp); - if (r < 0) - return log_oom(); - - r = sscanf(prefixlen_str, "%hhu/%hhu/%"SCNu32"/%"PRIu32"/"USEC_FMT, &tmp->dst_prefixlen, &tmp->tos, &tmp->priority, &tmp->table, &tmp->lifetime); - if (r != 5) { - log_link_debug(link, - "Failed to parse destination prefix length, tos, priority, table or expiration %s", - prefixlen_str); - continue; - } - - r = in_addr_from_string_auto(route_str, &tmp->family, &tmp->dst); - if (r < 0) { - log_link_debug_errno(link, r, "Failed to parse route destination %s: %m", route_str); - continue; - } - - r = route_add(link, tmp, &route); - if (r < 0) - return log_link_error_errno(link, r, "Failed to add route: %m"); - - if (route->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) { - r = sd_event_add_time(link->manager->event, &expire, clock_boottime_or_monotonic(), route->lifetime, - 0, route_expire_handler, route); - if (r < 0) - log_link_warning_errno(link, r, "Could not arm route expiration handler: %m"); - } - - sd_event_source_unref(route->expire); - route->expire = TAKE_PTR(expire); + prefixlen_str = strchr(route_str, '/'); + if (!prefixlen_str) { + log_link_debug(link, "Failed to parse route %s", route_str); + continue; } + *prefixlen_str++ = '\0'; + + r = route_new(&tmp); + if (r < 0) + return log_oom(); + + r = sscanf(prefixlen_str, + "%hhu/%hhu/%"SCNu32"/%"PRIu32"/"USEC_FMT, + &tmp->dst_prefixlen, + &tmp->tos, + &tmp->priority, + &tmp->table, + &tmp->lifetime); + if (r != 5) { + log_link_debug(link, + "Failed to parse destination prefix length, tos, priority, table or expiration %s", + prefixlen_str); + continue; + } + + r = in_addr_from_string_auto(route_str, &tmp->family, &tmp->dst); + if (r < 0) { + log_link_debug_errno(link, r, "Failed to parse route destination %s: %m", route_str); + continue; + } + + r = route_add(link, tmp, &route); + if (r < 0) + return log_link_error_errno(link, r, "Failed to add route: %m"); + + if (route->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) { + r = sd_event_add_time(link->manager->event, &expire, + clock_boottime_or_monotonic(), + route->lifetime, 0, route_expire_handler, route); + if (r < 0) + log_link_warning_errno(link, r, "Could not arm route expiration handler: %m"); + } + + sd_event_source_unref(route->expire); + route->expire = TAKE_PTR(expire); } if (dhcp4_address) {