core: address review feedback from Mike (#41354)

This commit addresses the review feedback from @YHNdnzj (many thanks)

Closes: https://github.com/systemd/systemd/issues/41324
This commit is contained in:
Mike Yuan
2026-03-26 18:18:01 +01:00
committed by GitHub
4 changed files with 32 additions and 37 deletions
+9 -6
View File
@@ -1543,17 +1543,20 @@ static int method_refuse_snapshot(sd_bus_message *message, void *userdata, sd_bu
static void log_caller(sd_bus_message *message, Manager *manager, const char *method) {
_cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL;
_cleanup_(pidref_done) PidRef pidref = PIDREF_NULL;
int r;
assert(message);
assert(manager);
assert(method);
if (sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT, &creds) < 0)
return;
/* We need at least the PID, otherwise there's nothing to log, the rest is optional. */
if (bus_creds_get_pidref(creds, &pidref) < 0)
return;
r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_PID|SD_BUS_CREDS_PIDFD|SD_BUS_CREDS_AUGMENT, &creds);
if (r < 0)
log_debug_errno(r, "Failed to get dbus sender creds, ignoring: %m");
else {
r = bus_creds_get_pidref(creds, &pidref);
if (r < 0)
log_debug_errno(r, "Failed to get peer pidref, ignoring: %m");
}
manager_log_caller(manager, &pidref, method);
}
+12 -21
View File
@@ -405,19 +405,19 @@ int vl_method_enqueue_marked_jobs_manager(sd_varlink *link, sd_json_variant *par
static int manager_do_set_objective(sd_varlink *link, sd_json_variant *parameters, ManagerObjective objective, const char *selinux_permission, bool can_do_root) {
Manager *m = ASSERT_PTR(sd_varlink_get_userdata(link));
_cleanup_free_ char *rt = NULL;
const char *root = NULL;
_cleanup_free_ char *root = NULL;
int r;
assert(link);
assert(parameters);
assert(selinux_permission);
if (!MANAGER_IS_SYSTEM(m))
return sd_varlink_error(link, SD_VARLINK_ERROR_METHOD_NOT_IMPLEMENTED, NULL);
if (can_do_root) {
static const sd_json_dispatch_field dispatch_table[] = {
{ "root", SD_JSON_VARIANT_STRING, sd_json_dispatch_const_string, 0, 0 },
{ "root", SD_JSON_VARIANT_STRING, json_dispatch_path, 0, 0 },
{}
};
@@ -431,49 +431,40 @@ static int manager_do_set_objective(sd_varlink *link, sd_json_variant *parameter
if (r < 0)
return r;
/* dbus uses SD_BUS_VTABLE_CAPABILITY(CAP_SYS_BOOT) in its checking. We cannot do the same
* because reading capabilities from /proc is racy (TOCTOU). So we use the stricter check
* TODO: figure out a way to check for CAP_SYS_BOOT */
r = varlink_check_privileged_peer(link);
if (r < 0)
return r;
if (!isempty(root)) {
if (!path_is_valid(root))
return sd_varlink_error_invalid_parameter_name(link, "root");
if (!path_is_absolute(root))
return sd_varlink_error_invalid_parameter_name(link, "root");
r = path_simplify_alloc(root, &rt);
if (r < 0)
return r;
if (root) {
assert(can_do_root);
path_simplify(root);
}
varlink_log_caller(link, m, manager_objective_to_string(objective));
if (can_do_root)
free_and_replace(m->switch_root, rt);
free_and_replace(m->switch_root, root);
m->objective = objective;
return sd_varlink_reply(link, NULL);
}
int vl_method_poweroff_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
int vl_method_poweroff(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
return manager_do_set_objective(link, parameters, MANAGER_POWEROFF, "halt", /* can_do_root= */ false);
}
int vl_method_reboot_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
int vl_method_reboot(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
return manager_do_set_objective(link, parameters, MANAGER_REBOOT, "reboot", /* can_do_root= */ false);
}
int vl_method_halt_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
int vl_method_halt(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
return manager_do_set_objective(link, parameters, MANAGER_HALT, "halt", /* can_do_root= */ false);
}
int vl_method_kexec_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
int vl_method_kexec(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
return manager_do_set_objective(link, parameters, MANAGER_KEXEC, "reboot", /* can_do_root= */ false);
}
int vl_method_soft_reboot_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
int vl_method_soft_reboot(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata) {
return manager_do_set_objective(link, parameters, MANAGER_SOFT_REBOOT, "reboot", /* can_do_root= */ true);
}
+6 -5
View File
@@ -9,8 +9,9 @@ int vl_method_describe_manager(sd_varlink *link, sd_json_variant *parameters, sd
int vl_method_reexecute_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_reload_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_enqueue_marked_jobs_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_poweroff_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_reboot_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_halt_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_kexec_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_soft_reboot_manager(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_poweroff(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_reboot(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_halt(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_kexec(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
int vl_method_soft_reboot(sd_varlink *link, sd_json_variant *parameters, sd_varlink_method_flags_t flags, void *userdata);
+5 -5
View File
@@ -390,11 +390,11 @@ int manager_setup_varlink_server(Manager *m) {
"io.systemd.Manager.Reexecute", vl_method_reexecute_manager,
"io.systemd.Manager.Reload", vl_method_reload_manager,
"io.systemd.Manager.EnqueueMarkedJobs", vl_method_enqueue_marked_jobs_manager,
"io.systemd.Manager.PowerOff", vl_method_poweroff_manager,
"io.systemd.Manager.Reboot", vl_method_reboot_manager,
"io.systemd.Manager.Halt", vl_method_halt_manager,
"io.systemd.Manager.KExec", vl_method_kexec_manager,
"io.systemd.Manager.SoftReboot", vl_method_soft_reboot_manager,
"io.systemd.Manager.PowerOff", vl_method_poweroff,
"io.systemd.Manager.Reboot", vl_method_reboot,
"io.systemd.Manager.Halt", vl_method_halt,
"io.systemd.Manager.KExec", vl_method_kexec,
"io.systemd.Manager.SoftReboot", vl_method_soft_reboot,
"io.systemd.Unit.List", vl_method_list_units,
"io.systemd.Unit.SetProperties", vl_method_set_unit_properties,
"io.systemd.service.Ping", varlink_method_ping,