core/dbus-manager: check for runtime scope first for system-wide operations

It's pointless to do selinux or /run/ space checks
for user managers.
This commit is contained in:
Mike Yuan
2024-07-03 10:11:24 +02:00
parent a85fe612d7
commit 541aadff97
+20 -20
View File
@@ -1688,14 +1688,14 @@ static int method_reboot(sd_bus_message *message, void *userdata, sd_bus_error *
assert(message);
r = mac_selinux_access_check(message, "reboot", error);
if (r < 0)
return r;
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"Reboot is only supported by system manager.");
r = mac_selinux_access_check(message, "reboot", error);
if (r < 0)
return r;
m->objective = MANAGER_REBOOT;
return sd_bus_reply_method_return(message, NULL);
@@ -1746,14 +1746,14 @@ static int method_poweroff(sd_bus_message *message, void *userdata, sd_bus_error
assert(message);
r = mac_selinux_access_check(message, "halt", error);
if (r < 0)
return r;
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"Powering off is only supported by system manager.");
r = mac_selinux_access_check(message, "halt", error);
if (r < 0)
return r;
m->objective = MANAGER_POWEROFF;
return sd_bus_reply_method_return(message, NULL);
@@ -1765,14 +1765,14 @@ static int method_halt(sd_bus_message *message, void *userdata, sd_bus_error *er
assert(message);
r = mac_selinux_access_check(message, "halt", error);
if (r < 0)
return r;
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"Halt is only supported by system manager.");
r = mac_selinux_access_check(message, "halt", error);
if (r < 0)
return r;
m->objective = MANAGER_HALT;
return sd_bus_reply_method_return(message, NULL);
@@ -1784,14 +1784,14 @@ static int method_kexec(sd_bus_message *message, void *userdata, sd_bus_error *e
assert(message);
r = mac_selinux_access_check(message, "reboot", error);
if (r < 0)
return r;
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"KExec is only supported by system manager.");
r = mac_selinux_access_check(message, "reboot", error);
if (r < 0)
return r;
m->objective = MANAGER_KEXEC;
return sd_bus_reply_method_return(message, NULL);
@@ -1805,6 +1805,10 @@ static int method_switch_root(sd_bus_message *message, void *userdata, sd_bus_er
assert(message);
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"Root switching is only supported by system manager.");
r = verify_run_space_permissive("root switching may fail", error);
if (r < 0)
return r;
@@ -1813,10 +1817,6 @@ static int method_switch_root(sd_bus_message *message, void *userdata, sd_bus_er
if (r < 0)
return r;
if (!MANAGER_IS_SYSTEM(m))
return sd_bus_error_set(error, SD_BUS_ERROR_NOT_SUPPORTED,
"Root switching is only supported by system manager.");
r = sd_bus_message_read(message, "ss", &root, &init);
if (r < 0)
return r;