On 12/23/2016 06:22 PM, G. Schlisio wrote:
>> Georg
>>
>> Replying to my own post: on re-reading the specification, it looks clear
>>
>> "On success, *getpwnam_r*() and *getpwuid_r*() return zero, and set
>> /*result/ to /pwd/. If no matching password record was found, these
>> functions return 0 and store NULL in /*result/. In case of error, an
>> error number is returned, and NULL is stored in /*result/. "
>>
>> So it's the various implementations that may be deviating from this:
>>
>> "Experiments on various UNIX-like systems show that lots of different
>> values occur in this situation: 0, ENOENT, EBADF, ESRCH, EWOULDBLOCK,
>> EPERM and probably others."
>>
>> In the case reported it is returning EINVAL (invalid argument). What
>> version of glibc are you using?
>>
>> John
>>
> we are running the glibc 2.24 from the official archlinux repository,
> last rebuild of glibc happened in early august this year and was no part
> of the update in question.
> georg
I saw a change in glibc 2.24 relating to EINVAL in the
nss/getXXbyYY_r.c. However that would not fit with the fact the you've
been using that version for some time without this issue, so I'm not
sure about it.

I think it would be useful to do another level of debugging to confirm
the issue. The following program is the example test program from the
getpwnam_r linux manual. Would you be able to compile it and run it on
the server that has the issue?

cc -o test test.c

then

./test AAAAAAAA

If it behaves properly it should say "not found". If it demonstrates the
error you were seeing originally, it should give a message about invalid
argument.

John

----------test.c-----------------

#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>

int
main(int argc, char *argv[])
{
    struct passwd pwd;
    struct passwd *result;
    char *buf;
    size_t bufsize;
    int s;

   if (argc != 2) {
        fprintf(stderr, "Usage: %s username\n", argv[0]);
        exit(EXIT_FAILURE);
    }

   bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
    if (bufsize == -1)          /* Value was indeterminate */
        bufsize = 16384;        /* Should be more than enough */

   buf = malloc(bufsize);
    if (buf == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }

   s = getpwnam_r(argv[1], &pwd, buf, bufsize, &result);
    if (result == NULL) {
        if (s == 0)
            printf("Not found\n");
        else {
            errno = s;
            perror("getpwnam_r");
        }
        exit(EXIT_FAILURE);
    }

   printf("Name: %s; UID: %ld\n", pwd.pw_gecos, (long) pwd.pw_uid);
    exit(EXIT_SUCCESS);
}

Reply via email to