fix getgrouplist when nscd reports an empty list
authorRich Felker <dalias@aerifal.cx>
Sun, 11 Oct 2020 00:04:18 +0000 (20:04 -0400)
committerRich Felker <dalias@aerifal.cx>
Thu, 15 Oct 2020 00:27:12 +0000 (20:27 -0400)
commit 500c6886c654fd45e4926990fee2c61d816be197 broke this by fixing
the behavior of fread to conform to the C standard; getgroupslist was
assuming the old behavior, that a request to read 1 member of length 0
would return 1, not 0.

src/passwd/getgrouplist.c

index 43e5182..301824c 100644 (file)
@@ -31,7 +31,8 @@ int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
        if (resp[INITGRFOUND]) {
                nscdbuf = calloc(resp[INITGRNGRPS], sizeof(uint32_t));
                if (!nscdbuf) goto cleanup;
-               if (!fread(nscdbuf, sizeof(*nscdbuf)*resp[INITGRNGRPS], 1, f)) {
+               size_t nbytes = sizeof(*nscdbuf)*resp[INITGRNGRPS];
+               if (nbytes && !fread(nscdbuf, nbytes, 1, f)) {
                        if (!ferror(f)) errno = EIO;
                        goto cleanup;
                }