]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: validate argvs on get-property/set-property too
authorLuca Boccassi <luca.boccassi@gmail.com>
Wed, 30 Apr 2025 14:24:20 +0000 (15:24 +0100)
committerLuca Boccassi <luca.boccassi@gmail.com>
Sat, 17 May 2025 11:43:20 +0000 (12:43 +0100)
Otherwise passing invalid data means asserts get hit instead of
handling it gracefully. Other verbs already do the same checks.

busctl get-property org.freedesktop.systemd1 '*' org.freedesktop.systemd1.Manager Version
Assertion 'object_path_is_valid(path)' failed at src/libsystemd/sd-bus/bus-message.c:562, function sd_bus_message_new_method_call(). Aborting.
Aborted (core dumped)

(cherry picked from commit b16e6fd76788e74ce7424404445e822655abd6c9)
(cherry picked from commit 6961d8ac6e0cc8d81c20c7de07595834ffabd556)

src/busctl/busctl.c
test/units/TEST-74-AUX-UTILS.busctl.sh

index bbd36c1dc42bcd37e0d2a10d16a132255ea42a11..53a750841e3541a65eae52b69324aa8e11d9cbb0 100644 (file)
@@ -2166,6 +2166,13 @@ static int get_property(int argc, char **argv, void *userdata) {
         _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
         int r;
 
+        if (!service_name_is_valid(argv[1]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid service name: %s", argv[1]);
+        if (!object_path_is_valid(argv[2]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid object path: %s", argv[2]);
+        if (!interface_name_is_valid(argv[3]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid interface name: %s", argv[3]);
+
         r = acquire_bus(false, &bus);
         if (r < 0)
                 return r;
@@ -2235,6 +2242,13 @@ static int set_property(int argc, char **argv, void *userdata) {
         char **p;
         int r;
 
+        if (!service_name_is_valid(argv[1]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid service name: %s", argv[1]);
+        if (!object_path_is_valid(argv[2]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid object path: %s", argv[2]);
+        if (!interface_name_is_valid(argv[3]))
+                return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Invalid interface name: %s", argv[3]);
+
         r = acquire_bus(false, &bus);
         if (r < 0)
                 return r;
index aaf96d08c1230ae90bbf72d33c472e22090c6ad7..b0afcd706909b6cf6f70758c59692ee1ec9546cb 100755 (executable)
@@ -108,3 +108,12 @@ busctl get-property -j \
 # Invalid argument
 (! busctl set-property org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager \
                        KExecWatchdogUSec t "foo")
+
+# Invalid destination
+(! busctl get-property '*' /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager Version)
+
+# Invalid object
+(! busctl get-property org.freedesktop.systemd1 '*' org.freedesktop.systemd1.Manager Version)
+
+# Invalid interface
+(! busctl get-property org.freedesktop.systemd1 /org/freedesktop/systemd1 '*' Version)