- if (gid != -1) {
- int i;
- for (i = 0; i < *start; ++i)
- if ((*groupsp)[i] == gid)
- break;
- if (i >= *start) {
- if (*start + 1 > *size) {
- gid_t *newgroups;
- long int newsize = 2 * *size;
- if (limit > 0) {
- if (*size >= limit)
- return NSS_STATUS_SUCCESS;
- if (newsize > limit)
- newsize = limit;
+ status = get_local_group(MAGIC_NONLOCAL_GROUPNAME,
+ &nonlocal_users_group, &buffer, errnop);
+ if (status == NSS_STATUS_SUCCESS) {
+ free(buffer);
+ if (is_nonlocal) {
+ if (!add_group(nonlocal_users_group.gr_gid, start, size, groupsp,
+ limit, errnop, &status))
+ return status;
+ } else {
+ int i;
+ for (i = 0; i < *start; ++i) {
+ if ((*groupsp)[i] == nonlocal_users_group.gr_gid) {
+ is_nonlocal = true;
+ break;
+ }
+ }
+
+ if (is_nonlocal) {
+ struct passwd pwbuf;
+ char *buf;
+ int nonlocal_errno = *errnop;
+ status = get_nonlocal_passwd(user, &pwbuf, &buf, errnop);
+
+ if (status == NSS_STATUS_SUCCESS) {
+ nonlocal_errno = *errnop;
+ status = check_nonlocal_gid(user, NULL, pwbuf.pw_gid,
+ &nonlocal_errno);
+ free(buf);