From 0fa5f9d4184928c28689b673fb06bb8b4d88a0c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pavel=20B=C5=99ezina?= Date: Thu, 6 Feb 2020 12:41:15 +0100 Subject: [PATCH] pam_usertype: remove dependency on pam_modutil_search_key This is needed to correctly backport the patch to this version. --- modules/pam_usertype/pam_usertype.c | 88 ++++++++++++++++++++++++++++- 1 file changed, 87 insertions(+), 1 deletion(-) diff --git a/modules/pam_usertype/pam_usertype.c b/modules/pam_usertype/pam_usertype.c index d3629c137d98545871d24ff26c06d8377068141f..741956b05809d8d6247fe2eba82ae14427cfeae4 100644 --- a/modules/pam_usertype/pam_usertype.c +++ b/modules/pam_usertype/pam_usertype.c @@ -40,6 +40,7 @@ #include "config.h" #include +#include #include #include #include @@ -72,6 +73,91 @@ struct pam_usertype_opts { int audit; }; +/* taken from pam_umask.c and reformatted */ +static char * +search_key (const char *filename, + const char *key) +{ + FILE *fp; + char *buf = NULL; + size_t buflen = 0; + char *retval = NULL; + + fp = fopen (filename, "r"); + if (NULL == fp) { + return NULL; + } + + while (!feof (fp)) { + char *tmp, *cp; +#if defined(HAVE_GETLINE) + ssize_t n = getline (&buf, &buflen, fp); +#elif defined (HAVE_GETDELIM) + ssize_t n = getdelim (&buf, &buflen, '\n', fp); +#else + ssize_t n; + + if (buf == NULL) { + buflen = BUF_SIZE; + buf = malloc (buflen); + if (buf == NULL) { + fclose (fp); + return NULL; + } + } + + buf[0] = '\0'; + if (fgets (buf, buflen - 1, fp) == NULL) { + break; + } else if (buf != NULL) { + n = strlen (buf); + } else { + n = 0; + } +#endif /* HAVE_GETLINE / HAVE_GETDELIM */ + + cp = buf; + + if (n < 1) { + break; + } + + tmp = strchr (cp, '#'); /* remove comments */ + if (tmp) { + *tmp = '\0'; + } + + while (isspace ((int)*cp)) { /* remove spaces and tabs */ + ++cp; + } + + if (*cp == '\0') { /* ignore empty lines */ + continue; + } + + if (cp[strlen (cp) - 1] == '\n') { + cp[strlen (cp) - 1] = '\0'; + } + + tmp = strsep (&cp, " \t="); + if (cp != NULL) { + while (isspace ((int)*cp) || *cp == '=') { + ++cp; + } + } + + if (strcasecmp (tmp, key) == 0) { + retval = strdup (cp); + break; + } + } + + fclose (fp); + free (buf); + + return retval; +} + static int pam_usertype_parse_args(struct pam_usertype_opts *opts, pam_handle_t *pamh, @@ -170,7 +256,7 @@ pam_usertype_get_id(pam_handle_t *pamh, char *ep; uid_t uid; - value = pam_modutil_search_key(pamh, LOGIN_DEFS, key); + value = search_key(LOGIN_DEFS, key); if (value == NULL) { return default_value; } -- 2.24.1