From: Mike Yuan Date: Thu, 26 Feb 2026 10:06:00 +0000 (+0100) Subject: core/cgroup: avoid one unnecessary strjoina() X-Git-Tag: v260-rc2~73^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=42aee39107fbdd7db1ccd402a2151822b2805e9f;p=thirdparty%2Fsystemd.git core/cgroup: avoid one unnecessary strjoina() --- diff --git a/src/core/cgroup.c b/src/core/cgroup.c index ad889db3b98..514dabf371b 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -2115,12 +2115,13 @@ static int unit_update_cgroup( return 0; } -static int unit_attach_pid_to_cgroup_via_bus(Unit *u, pid_t pid, const char *suffix_path) { +static int unit_attach_pid_to_cgroup_via_bus(Unit *u, const char *cgroup_path, pid_t pid) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; - char *pp; int r; assert(u); + assert(cgroup_path); + assert(pid_is_valid(pid)); if (MANAGER_IS_SYSTEM(u->manager)) return -EINVAL; @@ -2128,18 +2129,13 @@ static int unit_attach_pid_to_cgroup_via_bus(Unit *u, pid_t pid, const char *suf if (!u->manager->system_bus) return -EIO; - CGroupRuntime *crt = unit_get_cgroup_runtime(u); - if (!crt || !crt->cgroup_path) - return -EOWNERDEAD; - /* Determine this unit's cgroup path relative to our cgroup root */ - pp = path_startswith(crt->cgroup_path, u->manager->cgroup_root); + const char *pp = path_startswith_full(cgroup_path, + u->manager->cgroup_root, + PATH_STARTSWITH_RETURN_LEADING_SLASH|PATH_STARTSWITH_REFUSE_DOT_DOT); if (!pp) return -EINVAL; - pp = strjoina("/", pp, suffix_path); - path_simplify(pp); - r = bus_call_method(u->manager->system_bus, bus_systemd_mgr, "AttachProcessesToUnit", @@ -2172,8 +2168,10 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { CGroupRuntime *crt = ASSERT_PTR(unit_get_cgroup_runtime(u)); if (isempty(suffix_path)) - p = crt->cgroup_path; + p = empty_to_root(crt->cgroup_path); else { + assert(path_is_absolute(suffix_path)); + joined = path_join(crt->cgroup_path, suffix_path); if (!joined) return -ENOMEM; @@ -2189,7 +2187,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { * before we use it */ r = pidref_verify(pid); if (r < 0) { - log_unit_info_errno(u, r, "PID " PID_FMT " vanished before we could move it to target cgroup '%s', skipping: %m", pid->pid, empty_to_root(p)); + log_unit_info_errno(u, r, "PID " PID_FMT " vanished before we could move it to target cgroup '%s', skipping: %m", pid->pid, p); continue; } @@ -2199,7 +2197,7 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { log_unit_full_errno(u, again ? LOG_DEBUG : LOG_INFO, r, "Couldn't move process "PID_FMT" to%s requested cgroup '%s': %m", - pid->pid, again ? " directly" : "", empty_to_root(p)); + pid->pid, again ? " directly" : "", p); if (again) { int z; @@ -2209,11 +2207,11 @@ int unit_attach_pids_to_cgroup(Unit *u, Set *pids, const char *suffix_path) { * Since it's more privileged it might be able to move the process across the * leaves of a subtree whose top node is not owned by us. */ - z = unit_attach_pid_to_cgroup_via_bus(u, pid->pid, suffix_path); + z = unit_attach_pid_to_cgroup_via_bus(u, p, pid->pid); if (z >= 0) goto success; - log_unit_info_errno(u, z, "Couldn't move process "PID_FMT" to requested cgroup '%s' (directly or via the system bus): %m", pid->pid, empty_to_root(p)); + log_unit_info_errno(u, z, "Couldn't move process "PID_FMT" to requested cgroup '%s' (directly or via the system bus): %m", pid->pid, p); } RET_GATHER(ret, r);