dbus-manager: limit the number of states/patterns per query

Let's cap the number of states/patterns per query to something
reasonable, i.e. max 256 states and 4K patterns per query.
This commit is contained in:
Frantisek Sumsal
2026-05-01 20:01:57 +02:00
parent 7671b43cb8
commit eb357bfff8
2 changed files with 25 additions and 1 deletions
+20
View File
@@ -1251,6 +1251,14 @@ static int list_units_filtered(sd_bus_message *message, void *userdata, sd_bus_e
/* Anyone can call this method */
if (strv_length(states) > MANAGER_MAX_STATES_PER_CALL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many states in a single query.");
if (strv_length(patterns) > MANAGER_MAX_PATTERNS_PER_CALL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many patterns in a single query.");
r = sd_bus_message_new_method_return(message, &reply);
if (r < 0)
return r;
@@ -1434,6 +1442,10 @@ static int dump_impl(
assert(message);
if (strv_length(patterns) > MANAGER_MAX_PATTERNS_PER_CALL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many patterns in a single query.");
/* 'status' access is the bare minimum always needed for this, as the policy might straight out
* forbid a client from querying any information from systemd, regardless of any rate limiting. */
r = mac_selinux_access_check(message, "status", reterr_error);
@@ -2177,6 +2189,14 @@ static int list_unit_files_by_patterns(sd_bus_message *message, void *userdata,
/* Anyone can call this method */
if (strv_length(states) > MANAGER_MAX_STATES_PER_CALL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many states in a single query.");
if (strv_length(patterns) > MANAGER_MAX_PATTERNS_PER_CALL)
return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
"Too many patterns in a single query.");
r = mac_selinux_access_check(message, "status", reterr_error);
if (r < 0)
return r;
+5 -1
View File
@@ -14,9 +14,13 @@
struct libmnt_monitor;
/* Enforce upper limit how many names we allow */
/* Enforce upper limit on how many names we allow */
#define MANAGER_MAX_NAMES 131072 /* 128K */
/* Enforce upper limit on the number of patterns/states requested over IPC */
#define MANAGER_MAX_PATTERNS_PER_CALL 4096U
#define MANAGER_MAX_STATES_PER_CALL 256U
/* On sigrtmin+18, private commands */
enum {
MANAGER_SIGNAL_COMMAND_DUMP_JOBS = _COMMON_SIGNAL_COMMAND_PRIVATE_BASE + 0,