]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
busctl: fix timeout calculation for "busctl monitor"
authorLennart Poettering <lennart@poettering.net>
Mon, 28 Oct 2024 12:36:00 +0000 (13:36 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 29 Oct 2024 15:49:55 +0000 (16:49 +0100)
The --timeout= logic was implemented incorrectly, as it would not put a
a limit on the runtime of the operation, but only on the IO sleep.
However, spurious wakeups are possible, hence the timer would be reset
too often.

Fix that, by determining the absolute timestamp early, and checking
against that.

Follow-up for: 989e843e7543b21b91de4368da44692d674722a5
See: #34048

src/busctl/busctl.c

index 4eeb4a98e52d5e542fe08d41d9b7f72733cbbae7..2abf73010281b35d21e2907b5a69fa28ac2a7b39 100644 (file)
@@ -1268,6 +1268,9 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f
         if (r < 0)
                 return r;
 
+        usec_t end = arg_timeout > 0 ?
+                usec_add(now(CLOCK_MONOTONIC), arg_timeout) : USEC_INFINITY;
+
         /* upgrade connection; it's not used for anything else after this call */
         r = sd_bus_message_new_method_call(bus,
                                            &message,
@@ -1382,8 +1385,8 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f
                 if (r > 0)
                         continue;
 
-                r = sd_bus_wait(bus, arg_timeout > 0 ? arg_timeout : UINT64_MAX);
-                if (r == 0 && arg_timeout > 0) {
+                r = sd_bus_wait(bus, arg_timeout > 0 ? usec_sub_unsigned(end, now(CLOCK_MONOTONIC)) : UINT64_MAX);
+                if (r == 0 && arg_timeout > 0 && now(CLOCK_MONOTONIC) >= end) {
                         if (!arg_quiet && !sd_json_format_enabled(arg_json_format_flags))
                                 log_info("Timed out waiting for messages, exiting.");
                         return 0;