diff options
Diffstat (limited to 'modules/pammodutil/modutil_getgrgid.c')
-rw-r--r-- | modules/pammodutil/modutil_getgrgid.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/modules/pammodutil/modutil_getgrgid.c b/modules/pammodutil/modutil_getgrgid.c index dcac4f78..4520ff55 100644 --- a/modules/pammodutil/modutil_getgrgid.c +++ b/modules/pammodutil/modutil_getgrgid.c @@ -57,7 +57,7 @@ struct group *_pammodutil_getgrgid(pam_handle_t *pamh, gid_t gid) void *new_buffer; struct group *result = NULL; - new_buffer = realloc(buffer, sizeof(struct passwd) + length); + new_buffer = realloc(buffer, sizeof(struct group) + length); if (new_buffer == NULL) { D(("out of memory")); @@ -71,6 +71,7 @@ struct group *_pammodutil_getgrgid(pam_handle_t *pamh, gid_t gid) buffer = new_buffer; /* make the re-entrant call to get the grp structure */ + errno = 0; status = getgrgid_r(gid, buffer, sizeof(struct group) + (char *) buffer, length, &result); @@ -120,9 +121,12 @@ struct group *_pammodutil_getgrgid(pam_handle_t *pamh, gid_t gid) free(buffer); return NULL; + } else if (errno != ERANGE && errno != EINTR) { + /* no sense in repeating the call */ + break; } - length <<= 1; + length <<= 2; } while (length < PWD_ABSURD_PWD_LENGTH); |