From 46f2dd800f0bcb4eeb0a8cb6faa95aa8bedac106 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 13 Nov 2024 17:26:07 +0100 Subject: [PATCH 1/3] sd-bus/bus-common-errors: reorder one pid1 error to group with others --- src/libsystemd/sd-bus/bus-common-errors.c | 3 +-- src/libsystemd/sd-bus/bus-common-errors.h | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/libsystemd/sd-bus/bus-common-errors.c b/src/libsystemd/sd-bus/bus-common-errors.c index 03423bdcd3..895626c872 100644 --- a/src/libsystemd/sd-bus/bus-common-errors.c +++ b/src/libsystemd/sd-bus/bus-common-errors.c @@ -9,6 +9,7 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = { SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_UNIT, ENOENT), + SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_PROCESS, ESRCH), SD_BUS_ERROR_MAP(BUS_ERROR_NO_UNIT_FOR_PID, ESRCH), SD_BUS_ERROR_MAP(BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID, ENOENT), SD_BUS_ERROR_MAP(BUS_ERROR_UNIT_EXISTS, EEXIST), @@ -65,8 +66,6 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_common_errors[] = { SD_BUS_ERROR_MAP(BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED, EALREADY), SD_BUS_ERROR_MAP(BUS_ERROR_NO_NTP_SUPPORT, EOPNOTSUPP), - SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_PROCESS, ESRCH), - SD_BUS_ERROR_MAP(BUS_ERROR_NO_NAME_SERVERS, ESRCH), SD_BUS_ERROR_MAP(BUS_ERROR_INVALID_REPLY, EINVAL), SD_BUS_ERROR_MAP(BUS_ERROR_NO_SUCH_RR, ENOENT), diff --git a/src/libsystemd/sd-bus/bus-common-errors.h b/src/libsystemd/sd-bus/bus-common-errors.h index c460cd54e2..138d8a171e 100644 --- a/src/libsystemd/sd-bus/bus-common-errors.h +++ b/src/libsystemd/sd-bus/bus-common-errors.h @@ -4,6 +4,7 @@ #include "bus-error.h" #define BUS_ERROR_NO_SUCH_UNIT "org.freedesktop.systemd1.NoSuchUnit" +#define BUS_ERROR_NO_SUCH_PROCESS "org.freedesktop.systemd1.NoSuchProcess" #define BUS_ERROR_NO_UNIT_FOR_PID "org.freedesktop.systemd1.NoUnitForPID" #define BUS_ERROR_NO_UNIT_FOR_INVOCATION_ID "org.freedesktop.systemd1.NoUnitForInvocationID" #define BUS_ERROR_UNIT_EXISTS "org.freedesktop.systemd1.UnitExists" @@ -66,8 +67,6 @@ #define BUS_ERROR_AUTOMATIC_TIME_SYNC_ENABLED "org.freedesktop.timedate1.AutomaticTimeSyncEnabled" #define BUS_ERROR_NO_NTP_SUPPORT "org.freedesktop.timedate1.NoNTPSupport" -#define BUS_ERROR_NO_SUCH_PROCESS "org.freedesktop.systemd1.NoSuchProcess" - #define BUS_ERROR_NO_NAME_SERVERS "org.freedesktop.resolve1.NoNameServers" #define BUS_ERROR_INVALID_REPLY "org.freedesktop.resolve1.InvalidReply" #define BUS_ERROR_NO_SUCH_RR "org.freedesktop.resolve1.NoSuchRR" From 2f2058da0b88535cb3a95fc98e7b2f1ae4d35601 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 13 Nov 2024 17:45:53 +0100 Subject: [PATCH 2/3] portable: do not use SYNTHETIC_ERRNO for sd_bus_error_set_errno() The concept of synthetic errnos is about logging, which is irrelevant irt bus error and we don't do any special treatment in sd-bus for them, meaning the value propagated would be spurious. --- src/portable/portable.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/portable/portable.c b/src/portable/portable.c index 5476a86614..18a8060a9f 100644 --- a/src/portable/portable.c +++ b/src/portable/portable.c @@ -671,7 +671,7 @@ static int extract_image_and_extensions( if (r < 0) return r; if (isempty(id)) - return sd_bus_error_set_errnof(error, SYNTHETIC_ERRNO(ESTALE), "Image %s os-release metadata lacks the ID field", name_or_path); + return sd_bus_error_set_errnof(error, ESTALE, "Image %s os-release metadata lacks the ID field", name_or_path); if (prefixes) { valid_prefixes = strv_split(prefixes, WHITESPACE); @@ -715,7 +715,7 @@ static int extract_image_and_extensions( r = extension_release_validate(ext->path, id, version_id, confext_level, "portable", extension_release, IMAGE_CONFEXT); if (r == 0) - return sd_bus_error_set_errnof(error, SYNTHETIC_ERRNO(ESTALE), "Image %s extension-release metadata does not match the root's", ext->path); + return sd_bus_error_set_errnof(error, ESTALE, "Image %s extension-release metadata does not match the root's", ext->path); if (r < 0) return sd_bus_error_set_errnof(error, r, "Failed to compare image %s extension-release metadata with the root's os-release: %m", ext->path); } From 9c6dc69f3e3d338148e0bf6e19b9d0107856ac26 Mon Sep 17 00:00:00 2001 From: Mike Yuan Date: Wed, 13 Nov 2024 17:41:14 +0100 Subject: [PATCH 3/3] logind-session: be more specific about session_kill() errors When kill_whom == _ALL, there can be two cases that lead to ESRCH: the session expects no scope at all or the scope is not active. Let's distinguish the two cases. --- src/login/logind-session-dbus.c | 2 +- src/login/logind-session.c | 12 ++++++++---- src/login/logind-session.h | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/login/logind-session-dbus.c b/src/login/logind-session-dbus.c index cc2d581bc5..5300284e5a 100644 --- a/src/login/logind-session-dbus.c +++ b/src/login/logind-session-dbus.c @@ -360,7 +360,7 @@ int bus_session_method_kill(sd_bus_message *message, void *userdata, sd_bus_erro if (r == 0) return 1; /* Will call us back */ - r = session_kill(s, whom, signo); + r = session_kill(s, whom, signo, error); if (r < 0) return r; diff --git a/src/login/logind-session.c b/src/login/logind-session.c index 26ed2d3e49..351b64b60b 100644 --- a/src/login/logind-session.c +++ b/src/login/logind-session.c @@ -1387,16 +1387,20 @@ SessionState session_get_state(Session *s) { return SESSION_ONLINE; } -int session_kill(Session *s, KillWhom whom, int signo) { +int session_kill(Session *s, KillWhom whom, int signo, sd_bus_error *error) { assert(s); switch (whom) { case KILL_ALL: - if (!s->scope) - return -ESRCH; + if (!SESSION_CLASS_WANTS_SCOPE(s->class)) + return sd_bus_error_setf(error, SD_BUS_ERROR_NOT_SUPPORTED, + "Session '%s' has no associated scope", s->id); - return manager_kill_unit(s->manager, s->scope, KILL_ALL, signo, NULL); + if (!s->scope) + return sd_bus_error_set_errnof(error, ESRCH, "Scope for session '%s' not active", s->id); + + return manager_kill_unit(s->manager, s->scope, KILL_ALL, signo, error); case KILL_LEADER: return pidref_kill(&s->leader, signo); diff --git a/src/login/logind-session.h b/src/login/logind-session.h index 86ffc64bda..2d2cb189fc 100644 --- a/src/login/logind-session.h +++ b/src/login/logind-session.h @@ -191,7 +191,7 @@ int session_finalize(Session *s); int session_release(Session *s); int session_save(Session *s); int session_load(Session *s); -int session_kill(Session *s, KillWhom whom, int signo); +int session_kill(Session *s, KillWhom whom, int signo, sd_bus_error *error); SessionState session_get_state(Session *u);