You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
3.3 KiB
77 lines
3.3 KiB
From 169e74d772eac561a24f461ac65118d3d83a5980 Mon Sep 17 00:00:00 2001 |
|
From: Ivan Shapovalov <intelfx100@gmail.com> |
|
Date: Sat, 7 Mar 2015 18:11:32 +0300 |
|
Subject: [PATCH] sysusers: do not reject users with already present |
|
/etc/shadow entries |
|
|
|
This is needed to interoperate firstboot and sysusers. The former one is started |
|
first, and it writes only /etc/shadow when it is told to set the root password. |
|
It's better to relax checks here than to duplicate functionality in firstboot. |
|
|
|
(cherry picked from commit c5abf22514b3925aa6f0d4a3f36f76799bf1911b) |
|
--- |
|
src/sysusers/sysusers.c | 23 +++++++++-------------- |
|
1 file changed, 9 insertions(+), 14 deletions(-) |
|
|
|
diff --git a/src/sysusers/sysusers.c b/src/sysusers/sysusers.c |
|
index e47bcb4dca..76b5962c51 100644 |
|
--- a/src/sysusers/sysusers.c |
|
+++ b/src/sysusers/sysusers.c |
|
@@ -605,6 +605,8 @@ static int write_files(void) { |
|
if (r < 0) |
|
goto finish; |
|
|
|
+ lstchg = (long) (now(CLOCK_REALTIME) / USEC_PER_DAY); |
|
+ |
|
original = fopen(shadow_path, "re"); |
|
if (original) { |
|
struct spwd *sp; |
|
@@ -618,8 +620,13 @@ static int write_files(void) { |
|
|
|
i = hashmap_get(users, sp->sp_namp); |
|
if (i && i->todo_user) { |
|
- r = -EEXIST; |
|
- goto finish; |
|
+ /* we will update the existing entry */ |
|
+ sp->sp_lstchg = lstchg; |
|
+ |
|
+ /* only the /etc/shadow stage is left, so we can |
|
+ * safely remove the item from the todo set */ |
|
+ i->todo_user = false; |
|
+ hashmap_remove(todo_uids, UID_TO_PTR(i->uid)); |
|
} |
|
|
|
errno = 0; |
|
@@ -642,7 +649,6 @@ static int write_files(void) { |
|
goto finish; |
|
} |
|
|
|
- lstchg = (long) (now(CLOCK_REALTIME) / USEC_PER_DAY); |
|
HASHMAP_FOREACH(i, todo_uids, iterator) { |
|
struct spwd n = { |
|
.sp_namp = i->name, |
|
@@ -879,7 +885,6 @@ static int add_user(Item *i) { |
|
|
|
if (!arg_root) { |
|
struct passwd *p; |
|
- struct spwd *sp; |
|
|
|
/* Also check NSS */ |
|
errno = 0; |
|
@@ -895,16 +900,6 @@ static int add_user(Item *i) { |
|
} |
|
if (!IN_SET(errno, 0, ENOENT)) |
|
return log_error_errno(errno, "Failed to check if user %s already exists: %m", i->name); |
|
- |
|
- /* And shadow too, just to be sure */ |
|
- errno = 0; |
|
- sp = getspnam(i->name); |
|
- if (sp) { |
|
- log_error("User %s already exists in shadow database, but not in user database.", i->name); |
|
- return -EBADMSG; |
|
- } |
|
- if (!IN_SET(errno, 0, ENOENT)) |
|
- return log_error_errno(errno, "Failed to check if user %s already exists in shadow database: %m", i->name); |
|
} |
|
|
|
/* Try to use the suggested numeric uid */
|
|
|