fix libc-internal signal blocking on mips archs
[musl] / src / passwd / getgrouplist.c
index 0fddc9a..301824c 100644 (file)
@@ -28,10 +28,11 @@ int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
 
        f = __nscd_query(GETINITGR, user, resp, sizeof resp, &swap);
        if (!f) goto cleanup;
-       if (f != (FILE*)-1 && resp[INITGRFOUND]) {
+       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;
                }
@@ -40,7 +41,7 @@ int getgrouplist(const char *user, gid_t gid, gid_t *groups, int *ngroups)
                                nscdbuf[i] = bswap_32(nscdbuf[i]);
                }
        }
-       if (f != (FILE*)-1) fclose(f);
+       fclose(f);
 
        f = fopen("/etc/group", "rbe");
        if (!f && errno != ENOENT && errno != ENOTDIR)