On 12/25/2016 07:40 PM, John Fawcett wrote:
> Hi Georg
> thanks for that, so at least we have consistent behaviour which is good.
> I had got the AAAAAAAA from your logging without realizing it was
> anonymized.
>
> Now the problem to solve is why the user names you are testing with give
> the invalid argument. One reason would be if they are longer than 31
> chars. But if they are not then there is something else, for example do
> they contain a dot or some other character that archlinux does not
> accept in user names?
>
> At this point I suspect that your system is providing EINVAL for any
> name that could not be a valid local username (with one exception that
> it allows uppercase which is not valid in usernames). According to the
> archlinux useradd manual:
>
>        "Usernames must start with a lower case letter or an underscore,
> followed by lower case letters, digits,
>              underscores, or dashes. They can end with a dollar sign. In
> regular expression terms:
>              [a-z_][a-z0-9_-]*[$]?
>
>        Usernames may only be up to 32 characters long."
>
> This is a problem because the getpwnam_r routine on archlinux is
> deviating from the specifications by not always returning 0 for users
> that are not found. This should be addressed in archlinux or upstream in
> glibc. Can you take it back to the archlinux list and see if you can get
> this addressed?
>
> John
>
I managed to find where this is happening. It is not in glibc but in
systemd.

If your /etc/nsswitch.conf has something like this:

    passwd: compat mymachines systemd

then the routines that are being used are systemd ones.

The checks being done are here in the function valid_user_group_name:

https://github.com/systemd/systemd/blob/master/src/basic/user-util.c

and in the case that those checks fail then _nss_systemd_getpwnam_r from
systemd libraries returns EINVAL

https://github.com/systemd/systemd/blob/master/src/nss-systemd/nss-systemd.c

if (!valid_user_group_name(name)) {
                r = -EINVAL;
                goto fail;
}

...

fail:
        *errnop = -r;
return NSS_STATUS_UNAVAIL;

So the problem is that systemd version of getpwnam_r is deviating from
the standard of returning 0 for not found users.

Either the systemd library module or the nsswitch.conf is probably what
changed during your upgrade.

John




Reply via email to