]> 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>
Wed, 14 May 2025 20:33:39 +0000 (21:33 +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)

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

index 8971d8c28fc08444450fe84e4affbebc23eeb9d8..6e8a43d3bc6d8ba6a7d0f3bce44d40c34e68b420 100644 (file)
@@ -2236,6 +2236,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;
@@ -2405,6 +2412,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 0293dfd5bd8b2b77f5fd30da7b3e081e9e399b32..26a43317d42699e931928fdcfe516fbfd0149e12 100755 (executable)
@@ -117,6 +117,15 @@ busctl get-property -j \
 (! 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)
+
 busctl --quiet --timeout=1 --limit-messages=1 --match "interface=org.freedesktop.systemd1.Manager" monitor
 
 START_USEC=$(date +%s%6N)