+ if (gid != grp->gr_gid) {
+ syslog(LOG_ERR, "nss_nonlocal: discarding gid %d from lookup for gid %d\n", grp->gr_gid, gid);
+ return NSS_STATUS_NOTFOUND;
+ }
+
+ return check_nonlocal_group(grp->gr_name, grp, errnop);
+}
+
+static bool
+add_group(gid_t group, long int *start, long int *size, gid_t **groupsp,
+ long int limit, int *errnop, enum nss_status *status)
+{
+ int i, old_errno = errno;
+ for (i = 0; i < *start; ++i)
+ if ((*groupsp)[i] == group)
+ return true;
+ if (*start + 1 > *size) {
+ gid_t *newgroups;
+ long int newsize = 2 * *size;
+ if (limit > 0) {
+ if (*size >= limit) {
+ *status = NSS_STATUS_SUCCESS;
+ return false;
+ }
+ if (newsize > limit)
+ newsize = limit;
+ }
+ newgroups = realloc(*groupsp, newsize * sizeof((*groupsp)[0]));
+ errno = old_errno;
+ if (newgroups == NULL) {
+ *errnop = ENOMEM;
+ *status = NSS_STATUS_TRYAGAIN;
+ return false;
+ }
+ *groupsp = newgroups;
+ *size = newsize;
+ }
+ (*groupsp)[(*start)++] = group;
+ return true;