Blob Blame History Raw
From 0fa5f9d4184928c28689b673fb06bb8b4d88a0c2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pavel=20B=C5=99ezina?= <pbrezina@redhat.com>
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 <sys/types.h>
+#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
@@ -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