]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dbus: limit the number of env variables to something reasonable, vol. 2 41891/head
authorFrantisek Sumsal <frantisek@sumsal.cz>
Thu, 30 Apr 2026 12:03:47 +0000 (14:03 +0200)
committerFrantisek Sumsal <frantisek@sumsal.cz>
Fri, 1 May 2026 18:11:53 +0000 (20:11 +0200)
Turns out we can utilize this limit at a couple more places, so let's
move the previously defined limit constant to env-util.h and use it to
guard a couple more D-Bus methods. Also, bump it a bit, given it's meant
to be a safety cap that can't be hit in valid scenarios.

Follow-up for 7671b43cb88532cce2aa9ad12f777922206d6a42.

src/basic/env-util.h
src/core/dbus-manager.c
src/libsystemd/sd-json/json-util.h
src/machine/machine-dbus.c

index 28338a1458e07879ac0d2bcd1dcff684647b1567..4063517660b3035207c4fb2f1132e9704fda6cdb 100644 (file)
@@ -3,6 +3,8 @@
 
 #include "basic-forward.h"
 
+#define ENVIRONMENT_ASSIGNMENTS_MAX 16384U
+
 size_t sc_arg_max(void);
 
 bool env_name_is_valid(const char *e);
index 37b38c6ae9ee53a6a4f50913b0b33c51dd858b6c..0e93bc723c092ace4e254d7fe0c04a06c673c96d 100644 (file)
@@ -1892,6 +1892,10 @@ static int method_set_environment(sd_bus_message *message, void *userdata, sd_bu
         r = sd_bus_message_read_strv(message, &plus);
         if (r < 0)
                 return r;
+
+        if (strv_length(plus) > ENVIRONMENT_ASSIGNMENTS_MAX)
+                return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
+                                        "Too many environment assignments in a single query.");
         if (!strv_env_is_valid(plus))
                 return sd_bus_error_set(reterr_error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment assignments");
 
@@ -1923,6 +1927,9 @@ static int method_unset_environment(sd_bus_message *message, void *userdata, sd_
         if (r < 0)
                 return r;
 
+        if (strv_length(minus) > ENVIRONMENT_ASSIGNMENTS_MAX)
+                return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
+                                        "Too many environment variable names in a single query.");
         if (!strv_env_name_or_assignment_is_valid(minus))
                 return sd_bus_error_set(reterr_error, SD_BUS_ERROR_INVALID_ARGS,
                                         "Invalid environment variable names or assignments");
@@ -1959,6 +1966,9 @@ static int method_unset_and_set_environment(sd_bus_message *message, void *userd
         if (r < 0)
                 return r;
 
+        if (strv_length(plus) > ENVIRONMENT_ASSIGNMENTS_MAX || strv_length(minus) > ENVIRONMENT_ASSIGNMENTS_MAX)
+                return sd_bus_error_set(reterr_error, SD_BUS_ERROR_LIMITS_EXCEEDED,
+                                        "Too many environment variable names or assignments in a single query.");
         if (!strv_env_name_or_assignment_is_valid(minus))
                 return sd_bus_error_set(reterr_error, SD_BUS_ERROR_INVALID_ARGS,
                                         "Invalid environment variable names or assignments");
index 34d79d5238aaa916afeec3d48de2204119978a29..cea2d368b43db520e368857281f0f9a4f954c11f 100644 (file)
@@ -9,8 +9,6 @@
 #include "sd-forward.h"
 #include "string-util.h"        /* IWYU pragma: keep */
 
-#define ENVIRONMENT_ASSIGNMENTS_MAX 1024U
-
 #define JSON_VARIANT_REPLACE(v, q)        \
         do {                              \
                 typeof(v)* _v = &(v);     \
index a9d15ca5f72b1d5d81f74a341caad69d7e2cb446..28f64b3c9b6833195dbc560f4ca9828404d59454 100644 (file)
@@ -435,6 +435,10 @@ int bus_machine_method_open_shell(sd_bus_message *message, void *userdata, sd_bu
         r = sd_bus_message_read_strv(message, &env);
         if (r < 0)
                 return r;
+
+        if (strv_length(env) > ENVIRONMENT_ASSIGNMENTS_MAX)
+                return sd_bus_error_set(error, SD_BUS_ERROR_LIMITS_EXCEEDED,
+                                        "Too many environment assignments in a single query.");
         if (!strv_env_is_valid(env))
                 return sd_bus_error_set(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid environment assignments");