100 lines
4.9 KiB
Diff
100 lines
4.9 KiB
Diff
From b4a21d51487e21052af49b755d1707d4616e2977 Mon Sep 17 00:00:00 2001
|
|
From: Frantisek Sumsal <frantisek@sumsal.cz>
|
|
Date: Sun, 24 Dec 2023 14:49:23 +0100
|
|
Subject: [PATCH] busctl: avoid asserting on NULL message
|
|
MIME-Version: 1.0
|
|
Content-Type: text/plain; charset=UTF-8
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
Avoid passing a NULL message to sd_bus_message_is_signal(), to not trip
|
|
over an assertion:
|
|
|
|
[ 132.869436] H testsuite-82.sh[614]: + systemctl --no-block --check-inhibitors=yes soft-reboot
|
|
[ 132.967386] H systemd[1]: Created slice system-systemd\x2dcoredump.slice.
|
|
[ 133.018292] H systemd[1]: Starting inhibit.service...
|
|
[ 133.122610] H systemd[1]: Started systemd-coredump@0-665-0.service.
|
|
[ 133.163643] H systemd[1]: Started inhibit.service.
|
|
[ 133.206836] H testsuite-82.sh[614]: + exec sleep infinity
|
|
[ 133.236762] H systemd-logind[611]: The system will reboot now!
|
|
[ 135.891607] H systemd-coredump[667]: [🡕] Process 663 (busctl) of user 0 dumped core.
|
|
|
|
Stack trace of thread 663:
|
|
#0 0x00007f2ec45e6acf raise (libc.so.6 + 0x4eacf)
|
|
#1 0x00007f2ec45b9ea5 abort (libc.so.6 + 0x21ea5)
|
|
#2 0x00007f2ec4b5c9a6 log_assert_failed (libsystemd-shared-255.so + 0x1ff9a6)
|
|
#3 0x00007f2ec4b5dca5 log_assert_failed_return (libsystemd-shared-255.so + 0x200ca5)
|
|
#4 0x00007f2ec4bb3df6 sd_bus_message_is_signal (libsystemd-shared-255.so + 0x256df6)
|
|
#5 0x000000000040e478 monitor (busctl + 0xe478)
|
|
#6 0x000000000040e82f verb_monitor (busctl + 0xe82f)
|
|
#7 0x00007f2ec4b202cb dispatch_verb (libsystemd-shared-255.so + 0x1c32cb)
|
|
#8 0x00000000004074fa busctl_main (busctl + 0x74fa)
|
|
#9 0x0000000000407525 run (busctl + 0x7525)
|
|
#10 0x000000000040ff67 main (busctl + 0xff67)
|
|
#11 0x00007f2ec45d2d85 __libc_start_main (libc.so.6 + 0x3ad85)
|
|
#12 0x00000000004044be _start (busctl + 0x44be)
|
|
ELF object binary architecture: AMD x86-64
|
|
[ 136.141152] H dbus-daemon[634]: [system] Monitoring connection :1.2 closed.
|
|
[ 136.152233] H systemd[1]: busctl.service: Main process exited, code=dumped, status=6/ABRT
|
|
[ 136.153996] H systemd[1]: busctl.service: Failed with result 'core-dump'.
|
|
|
|
The asertion in question:
|
|
|
|
Assertion 'm' failed at src/libsystemd/sd-bus/bus-message.c:1015, function sd_bus_message_is_signal(). Aborting.
|
|
|
|
We can get a NULL message here through sd_bus_process() ->
|
|
bus_process_internal() -> process_running(), so let's handle this case
|
|
appropriately.
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/systemd/systemd/commit/b4a21d51487e21052af49b755d1707d4616e2977
|
|
|
|
---
|
|
src/busctl/busctl.c | 26 +++++++++++++-------------
|
|
1 file changed, 13 insertions(+), 13 deletions(-)
|
|
|
|
diff --git a/src/busctl/busctl.c b/src/busctl/busctl.c
|
|
index d233fc55ad..b2c2bc644d 100644
|
|
--- a/src/busctl/busctl.c
|
|
+++ b/src/busctl/busctl.c
|
|
@@ -1320,24 +1320,24 @@ static int monitor(int argc, char **argv, int (*dump)(sd_bus_message *m, FILE *f
|
|
if (r < 0)
|
|
return log_error_errno(r, "Failed to process bus: %m");
|
|
|
|
- if (!is_monitor) {
|
|
- const char *name;
|
|
+ if (m) {
|
|
+ if (!is_monitor) {
|
|
+ const char *name;
|
|
|
|
- /* wait until we lose our unique name */
|
|
- if (sd_bus_message_is_signal(m, "org.freedesktop.DBus", "NameLost") <= 0)
|
|
- continue;
|
|
+ /* wait until we lose our unique name */
|
|
+ if (sd_bus_message_is_signal(m, "org.freedesktop.DBus", "NameLost") <= 0)
|
|
+ continue;
|
|
|
|
- r = sd_bus_message_read(m, "s", &name);
|
|
- if (r < 0)
|
|
- return bus_log_parse_error(r);
|
|
+ r = sd_bus_message_read(m, "s", &name);
|
|
+ if (r < 0)
|
|
+ return bus_log_parse_error(r);
|
|
|
|
- if (streq(name, unique_name))
|
|
- is_monitor = true;
|
|
+ if (streq(name, unique_name))
|
|
+ is_monitor = true;
|
|
|
|
- continue;
|
|
- }
|
|
+ continue;
|
|
+ }
|
|
|
|
- if (m) {
|
|
dump(m, stdout);
|
|
fflush(stdout);
|
|
|
|
--
|
|
2.39.1
|
|
|