From 869c1cf88fdb17681ec2cc274d04622f6f21e95c Mon Sep 17 00:00:00 2001 From: Nick Rosbrook Date: Mon, 16 Oct 2023 13:13:57 -0400 Subject: [PATCH] nspawn: check if we can set CoredumpReceive= before doing so If systemd-nspawn is newer than the running systemd, we might try to set CoredumpReceive=yes when systemd doesn't know about it yet. Try and check if the running systemd is aware of this setting, and if not, don't try and use it. Fixes 411d8c72ec ("nspawn: set CoredumpReceive=yes on container's scope when --boot is set"). --- src/nspawn/nspawn-register.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/src/nspawn/nspawn-register.c b/src/nspawn/nspawn-register.c index f8f82e91b1b..66962d7ba95 100644 --- a/src/nspawn/nspawn-register.c +++ b/src/nspawn/nspawn-register.c @@ -108,6 +108,32 @@ static int append_controller_property(sd_bus *bus, sd_bus_message *m) { return 0; } +static int can_set_coredump_receive(sd_bus *bus) { + _cleanup_(sd_bus_error_free) sd_bus_error e = SD_BUS_ERROR_NULL; + _cleanup_free_ char *path = NULL; + int b, r; + + assert(bus); + + path = unit_dbus_path_from_name(SPECIAL_INIT_SCOPE); + if (!path) + return log_oom(); + + r = sd_bus_get_property_trivial( + bus, + "org.freedesktop.systemd1", + path, + "org.freedesktop.systemd1.Scope", + "CoredumpReceive", + &e, + 'b', &b); + if (r < 0 && !sd_bus_error_has_names(&e, SD_BUS_ERROR_UNKNOWN_PROPERTY, SD_BUS_ERROR_PROPERTY_READ_ONLY)) + log_warning_errno(r, "Failed to determine if CoredumpReceive= can be set, assuming it cannot be: %s", + bus_error_message(&e, r)); + + return r >= 0; +} + int register_machine( sd_bus *bus, const char *machine_name, @@ -184,7 +210,7 @@ int register_machine( mounts, n_mounts, kill_signal, - start_mode == START_BOOT); + start_mode == START_BOOT && can_set_coredump_receive(bus) > 0); if (r < 0) return r; @@ -307,7 +333,7 @@ int allocate_scope( mounts, n_mounts, kill_signal, - start_mode == START_BOOT); + start_mode == START_BOOT && can_set_coredump_receive(bus) > 0); if (r < 0) return r;