[systemd-devel] [PATCH 3/3] sysusers: do not reject users with already present /etc/shadow entries

Zbigniew Jędrzejewski-Szmek zbyszek at in.waw.pl
Sat Mar 7 06:09:46 PST 2015


On Thu, Feb 26, 2015 at 02:46:25AM +0300, Ivan Shapovalov wrote:
> 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.
Does not apply on top of git... Could you rebase?

Zbyszek

> ---
>  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 9d39bd4..ec3e8ad 100644
> --- a/src/sysusers/sysusers.c
> +++ b/src/sysusers/sysusers.c
> @@ -603,6 +603,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;
> @@ -616,8 +618,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;
> @@ -640,7 +647,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,
> @@ -877,7 +883,6 @@ static int add_user(Item *i) {
>  
>          if (!arg_root_dest) {
>                  struct passwd *p;
> -                struct spwd *sp;
>  
>                  /* Also check NSS */
>                  errno = 0;
> @@ -893,16 +898,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 */
> -- 
> 2.3.0
> 
> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel


More information about the systemd-devel mailing list