123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- #include "pam_modutil_private.h"
- #include <errno.h>
- #include <limits.h>
- #include <grp.h>
- #include <stdio.h>
- #include <stdlib.h>
- static int intlen(int number)
- {
- int len = 2;
- while (number != 0) {
- number /= 10;
- len++;
- }
- return len;
- }
- static int longlen(long number)
- {
- int len = 2;
- while (number != 0) {
- number /= 10;
- len++;
- }
- return len;
- }
- struct group *
- pam_modutil_getgrgid(pam_handle_t *pamh, gid_t gid)
- {
- #ifdef HAVE_GETGRGID_R
- void *buffer=NULL;
- size_t length = PWD_INITIAL_LENGTH;
- do {
- int status;
- void *new_buffer;
- struct group *result = NULL;
- new_buffer = realloc(buffer, sizeof(struct group) + length);
- if (new_buffer == NULL) {
- D(("out of memory"));
-
- if (buffer) {
- free(buffer);
- }
- return NULL;
- }
- buffer = new_buffer;
-
- errno = 0;
- status = getgrgid_r(gid, buffer,
- sizeof(struct group) + (char *) buffer,
- length, &result);
- if (!status && (result == buffer)) {
- char *data_name;
- const void *ignore;
- int i;
- data_name = malloc(strlen("_pammodutil_getgrgid") + 1 +
- longlen((long)gid) + 1 + intlen(INT_MAX) + 1);
- if ((pamh != NULL) && (data_name == NULL)) {
- D(("was unable to register the data item [%s]",
- pam_strerror(pamh, status)));
- free(buffer);
- return NULL;
- }
- if (pamh != NULL) {
- for (i = 0; i < INT_MAX; i++) {
- sprintf(data_name, "_pammodutil_getgrgid_%ld_%d",
- (long) gid, i);
- status = PAM_NO_MODULE_DATA;
- if (pam_get_data(pamh, data_name, &ignore) != PAM_SUCCESS) {
- status = pam_set_data(pamh, data_name,
- result, pam_modutil_cleanup);
- }
- if (status == PAM_SUCCESS) {
- break;
- }
- }
- } else {
- status = PAM_SUCCESS;
- }
- free(data_name);
- if (status == PAM_SUCCESS) {
- D(("success"));
- return result;
- }
- D(("was unable to register the data item [%s]",
- pam_strerror(pamh, status)));
- free(buffer);
- return NULL;
- } else if (errno != ERANGE && errno != EINTR) {
-
- break;
- }
- length <<= PWD_LENGTH_SHIFT;
- } while (length < PWD_ABSURD_PWD_LENGTH);
- D(("grp structure took %u bytes or so of memory",
- length+sizeof(struct group)));
- free(buffer);
- return NULL;
- #else
-
- return getgrgid(gid);
- #endif
- }
|