/* 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;
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);
/* 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;
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,