dcavalca / rpms / systemd

Forked from rpms/systemd 3 months ago
Clone
Zbigniew Jędrzejewski-Szmek 111b3c
From e3ba241cd4003ee6eb6704e8c53240687534d6ce Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 111b3c
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 111b3c
Date: Tue, 3 Mar 2020 10:18:32 +0100
Zbigniew Jędrzejewski-Szmek 111b3c
Subject: [PATCH] sysusers: many different errnos to express one condition
Zbigniew Jędrzejewski-Szmek 111b3c
Zbigniew Jędrzejewski-Szmek 111b3c
See https://bugzilla.redhat.com/show_bug.cgi?id=1807768. It turns
Zbigniew Jędrzejewski-Szmek 111b3c
out that sysusers cannot query if the group exists:
Zbigniew Jędrzejewski-Szmek 111b3c
Failed to check if group dnsmasq already exists: No such process
Zbigniew Jędrzejewski-Szmek 111b3c
...
Zbigniew Jędrzejewski-Szmek 111b3c
Failed to check if group systemd-timesync already exists: No such process
Zbigniew Jędrzejewski-Szmek 111b3c
Zbigniew Jędrzejewski-Szmek 111b3c
When the same command is executed later, the issue does not occur. Not sure why
Zbigniew Jędrzejewski-Szmek 111b3c
the behaviour in the initial transaction is different. But let's accept all
Zbigniew Jędrzejewski-Szmek 111b3c
errors that the man pages list.
Zbigniew Jędrzejewski-Szmek 111b3c
---
Zbigniew Jędrzejewski-Szmek 111b3c
 src/sysusers/sysusers.c | 10 ++++++++--
Zbigniew Jędrzejewski-Szmek 111b3c
 1 file changed, 8 insertions(+), 2 deletions(-)
Zbigniew Jędrzejewski-Szmek 111b3c
Zbigniew Jędrzejewski-Szmek 111b3c
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek 111b3c
index 2771fd959f..1b1f19e817 100644
Zbigniew Jędrzejewski-Szmek 111b3c
--- a/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek 111b3c
+++ b/src/sysusers/sysusers.c
Zbigniew Jędrzejewski-Szmek 111b3c
@@ -94,6 +94,12 @@ STATIC_DESTRUCTOR_REGISTER(database_groups, set_free_freep);
Zbigniew Jędrzejewski-Szmek 111b3c
 STATIC_DESTRUCTOR_REGISTER(uid_range, freep);
Zbigniew Jędrzejewski-Szmek 111b3c
 STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
Zbigniew Jędrzejewski-Szmek 111b3c
 
Zbigniew Jędrzejewski-Szmek 111b3c
+static int errno_is_not_exists(int code) {
Zbigniew Jędrzejewski-Szmek 111b3c
+        /* See getpwnam(3) and getgrnam(3): those codes and others can be returned if the user or group are
Zbigniew Jędrzejewski-Szmek 111b3c
+         * not found. */
Zbigniew Jędrzejewski-Szmek 111b3c
+        return IN_SET(code, 0, ENOENT, ESRCH, EBADF, EPERM);
Zbigniew Jędrzejewski-Szmek 111b3c
+}
Zbigniew Jędrzejewski-Szmek 111b3c
+
Zbigniew Jędrzejewski-Szmek 111b3c
 static int load_user_database(void) {
Zbigniew Jędrzejewski-Szmek 111b3c
         _cleanup_fclose_ FILE *f = NULL;
Zbigniew Jędrzejewski-Szmek 111b3c
         const char *passwd_path;
Zbigniew Jędrzejewski-Szmek 111b3c
@@ -971,7 +977,7 @@ static int add_user(Item *i) {
Zbigniew Jędrzejewski-Szmek 111b3c
 
Zbigniew Jędrzejewski-Szmek 111b3c
                         return 0;
Zbigniew Jędrzejewski-Szmek 111b3c
                 }
Zbigniew Jędrzejewski-Szmek 111b3c
-                if (!IN_SET(errno, 0, ENOENT))
Zbigniew Jędrzejewski-Szmek 111b3c
+                if (!errno_is_not_exists(errno))
Zbigniew Jędrzejewski-Szmek 111b3c
                         return log_error_errno(errno, "Failed to check if user %s already exists: %m", i->name);
Zbigniew Jędrzejewski-Szmek 111b3c
         }
Zbigniew Jędrzejewski-Szmek 111b3c
 
Zbigniew Jędrzejewski-Szmek 111b3c
@@ -1108,7 +1114,7 @@ static int get_gid_by_name(const char *name, gid_t *gid) {
Zbigniew Jędrzejewski-Szmek 111b3c
                         *gid = g->gr_gid;
Zbigniew Jędrzejewski-Szmek 111b3c
                         return 0;
Zbigniew Jędrzejewski-Szmek 111b3c
                 }
Zbigniew Jędrzejewski-Szmek 111b3c
-                if (!IN_SET(errno, 0, ENOENT))
Zbigniew Jędrzejewski-Szmek 111b3c
+                if (!errno_is_not_exists(errno))
Zbigniew Jędrzejewski-Szmek 111b3c
                         return log_error_errno(errno, "Failed to check if group %s already exists: %m", name);
Zbigniew Jędrzejewski-Szmek 111b3c
         }
Zbigniew Jędrzejewski-Szmek 111b3c