aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Schubert <schubi@suse.de>2024-06-27 16:06:36 +0200
committerDmitry V. Levin <ldv@strace.io>2024-07-02 08:00:00 +0000
commitbc461898448a1bf306fc094cdf6a5a197c4e2753 (patch)
tree03a14e47e3cbdfbe55e15aee53a2183700dd9737
parentefa6e33b1da594f2a2c4c2c8871416a3d5011015 (diff)
downloadpam-bc461898448a1bf306fc094cdf6a5a197c4e2753.tar.gz
pam-bc461898448a1bf306fc094cdf6a5a197c4e2753.tar.bz2
pam-bc461898448a1bf306fc094cdf6a5a197c4e2753.zip
libpam_internal: introduce pam_econf_readconfig
Use this new function instead of econf_readDirs() and econf_readDirsWithCallback(). Co-authored-by: Dmitry V. Levin <ldv@strace.io>
-rw-r--r--libpam/pam_modutil_searchkey.c12
-rw-r--r--libpam_internal/Makefile.am8
-rw-r--r--libpam_internal/include/pam_econf.h22
-rw-r--r--libpam_internal/pam_econf.c34
-rw-r--r--modules/pam_env/Makefile.am5
-rw-r--r--modules/pam_env/pam_env.c7
-rw-r--r--modules/pam_shells/Makefile.am8
-rw-r--r--modules/pam_shells/pam_shells.c24
8 files changed, 93 insertions, 27 deletions
diff --git a/libpam/pam_modutil_searchkey.c b/libpam/pam_modutil_searchkey.c
index 5480db1d..ccf2461f 100644
--- a/libpam/pam_modutil_searchkey.c
+++ b/libpam/pam_modutil_searchkey.c
@@ -14,7 +14,7 @@
#include <stdlib.h>
#include <ctype.h>
#ifdef USE_ECONF
-#include <libeconf.h>
+#include "pam_econf.h"
#endif
#ifdef USE_ECONF
@@ -29,10 +29,14 @@ econf_search_key (const char *name, const char *suffix, const char *key)
{
econf_file *key_file = NULL;
char *val;
+ econf_err error;
- if (econf_readDirs (&key_file, VENDORDIR, SYSCONFDIR, name, suffix,
- " \t", "#"))
- return NULL;
+ error = pam_econf_readconfig (&key_file, VENDORDIR, SYSCONFDIR, name, suffix,
+ " \t", "#", NULL, NULL);
+ if (error != ECONF_SUCCESS) {
+ econf_free (key_file);
+ return NULL;
+ }
if (econf_getStringValue (key_file, NULL, key, &val)) {
econf_free (key_file);
diff --git a/libpam_internal/Makefile.am b/libpam_internal/Makefile.am
index 1078cf0f..b368ebc8 100644
--- a/libpam_internal/Makefile.am
+++ b/libpam_internal/Makefile.am
@@ -1,10 +1,12 @@
noinst_LTLIBRARIES = libpam_internal.la
-noinst_HEADERS = include/pam_line.h
+noinst_HEADERS = include/pam_line.h include/pam_econf.h
AM_CFLAGS = -I$(top_srcdir)/libpam_internal/include \
- -I$(top_srcdir)/libpam/include $(WARN_CFLAGS)
+ -I$(top_srcdir)/libpam/include $(WARN_CFLAGS) \
+ $(ECONF_CFLAGS)
libpam_internal_la_SOURCES = \
pam_debug.c \
- pam_line.c
+ pam_line.c \
+ pam_econf.c
diff --git a/libpam_internal/include/pam_econf.h b/libpam_internal/include/pam_econf.h
new file mode 100644
index 00000000..ebba659d
--- /dev/null
+++ b/libpam_internal/include/pam_econf.h
@@ -0,0 +1,22 @@
+/* pam_econf.h -- routines to parse configuration files with libeconf */
+
+#ifndef PAM_ECONF_H
+#define PAM_ECONF_H
+
+#ifdef USE_ECONF
+
+#include <libeconf.h>
+
+econf_err pam_econf_readconfig(econf_file **key_file,
+ const char *usr_conf_dir,
+ const char *etc_conf_dir,
+ const char *config_name,
+ const char *config_suffix,
+ const char *delim,
+ const char *comment,
+ bool (*callback)(const char *filename, const void *data),
+ const void *callback_data);
+
+#endif /* USE_ECONF */
+
+#endif /* PAM_ECONF_H */
diff --git a/libpam_internal/pam_econf.c b/libpam_internal/pam_econf.c
new file mode 100644
index 00000000..595c122a
--- /dev/null
+++ b/libpam_internal/pam_econf.c
@@ -0,0 +1,34 @@
+/* pam_econf.c -- routines to parse configuration files with libeconf */
+
+#include "config.h"
+
+#ifdef USE_ECONF
+
+#include <stdio.h>
+#include <security/_pam_macros.h>
+#include "pam_econf.h"
+
+econf_err pam_econf_readconfig(econf_file **key_file,
+ const char *usr_conf_dir,
+ const char *etc_conf_dir,
+ const char *config_name,
+ const char *config_suffix,
+ const char *delim,
+ const char *comment,
+ bool (*callback)(const char *filename, const void *data),
+ const void *callback_data)
+{
+ econf_err ret;
+ D(("Read configuration from directory %s and %s", etc_conf_dir, usr_conf_dir));
+ ret = econf_readDirsWithCallback(key_file,
+ usr_conf_dir,
+ etc_conf_dir,
+ config_name,
+ config_suffix,
+ delim,
+ comment,
+ callback, callback_data);
+ return ret;
+}
+
+#endif /* USE_ECONF */
diff --git a/modules/pam_env/Makefile.am b/modules/pam_env/Makefile.am
index 885c9aa3..e75b3485 100644
--- a/modules/pam_env/Makefile.am
+++ b/modules/pam_env/Makefile.am
@@ -22,8 +22,9 @@ secureconfdir = $(SCONFIGDIR)
endif
AM_CFLAGS = -I$(top_srcdir)/libpam_internal/include \
- -I$(top_srcdir)/libpam/include $(WARN_CFLAGS) \
- -DSYSCONFDIR=\"$(sysconfdir)\" $(ECONF_CFLAGS)
+ -I$(top_srcdir)/libpam/include \
+ -I$(top_srcdir)/libpam_internal/include \
+ -DSYSCONFDIR=\"$(sysconfdir)\" $(WARN_CFLAGS) $(ECONF_CFLAGS)
AM_LDFLAGS = -no-undefined -avoid-version -module
if HAVE_VERSIONING
AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map
diff --git a/modules/pam_env/pam_env.c b/modules/pam_env/pam_env.c
index 7c146439..1bb7b2c3 100644
--- a/modules/pam_env/pam_env.c
+++ b/modules/pam_env/pam_env.c
@@ -21,7 +21,7 @@
#include <sys/types.h>
#include <unistd.h>
#ifdef USE_ECONF
-#include <libeconf.h>
+#include "pam_econf.h"
#endif
#include <security/pam_modules.h>
@@ -241,9 +241,8 @@ econf_read_file(const pam_handle_t *pamh, const char *filename, const char *deli
}
}
- D(("Read configuration from directory %s and %s", vendor_dir, sysconf_dir));
- error = econf_readDirs (&key_file, vendor_dir, sysconf_dir, name, suffix,
- delim, "#");
+ error = pam_econf_readconfig (&key_file, vendor_dir, sysconf_dir, name, suffix,
+ delim, "#", NULL, NULL);
free(vendor_dir);
free(sysconf_dir);
if (error != ECONF_SUCCESS) {
diff --git a/modules/pam_shells/Makefile.am b/modules/pam_shells/Makefile.am
index 18b44fa4..913bde6a 100644
--- a/modules/pam_shells/Makefile.am
+++ b/modules/pam_shells/Makefile.am
@@ -21,14 +21,18 @@ else
secureconfdir = $(SCONFIGDIR)
endif
-AM_CFLAGS = -I$(top_srcdir)/libpam/include $(WARN_CFLAGS) $(ECONF_CFLAGS)
+AM_CFLAGS = -I$(top_srcdir)/libpam/include \
+ -I$(top_srcdir)/libpam_internal/include \
+ $(WARN_CFLAGS) $(ECONF_CFLAGS)
AM_LDFLAGS = -no-undefined -avoid-version -module
if HAVE_VERSIONING
AM_LDFLAGS += -Wl,--version-script=$(srcdir)/../modules.map
endif
securelib_LTLIBRARIES = pam_shells.la
-pam_shells_la_LIBADD = $(top_builddir)/libpam/libpam.la $(ECONF_LIBS)
+pam_shells_la_LIBADD = $(top_builddir)/libpam/libpam.la \
+ $(top_builddir)/libpam_internal/libpam_internal.la \
+ $(ECONF_LIBS)
if ENABLE_REGENERATE_MAN
dist_noinst_DATA = README
diff --git a/modules/pam_shells/pam_shells.c b/modules/pam_shells/pam_shells.c
index d5f8ec35..bacf4f55 100644
--- a/modules/pam_shells/pam_shells.c
+++ b/modules/pam_shells/pam_shells.c
@@ -19,7 +19,7 @@
#include <syslog.h>
#include <unistd.h>
#if defined (USE_ECONF) && defined (VENDORDIR)
-#include <libeconf.h>
+#include "pam_econf.h"
#endif
#include <security/pam_modules.h>
@@ -81,17 +81,17 @@ static int perform_check(pam_handle_t *pamh)
size_t size = 0;
econf_err error;
char **keys;
- econf_file *key_file;
-
- error = econf_readDirsWithCallback(&key_file,
- VENDORDIR,
- ETCDIR,
- SHELLS,
- NULL,
- "", /* key only */
- "#", /* comment */
- check_file, pamh);
- if (error) {
+ econf_file *key_file = NULL;
+
+ error = pam_econf_readconfig(&key_file,
+ VENDORDIR,
+ ETCDIR,
+ SHELLS,
+ NULL,
+ "", /* key only */
+ "#", /* comment */
+ check_file, pamh);
+ if (error != ECONF_SUCCESS) {
pam_syslog(pamh, LOG_ERR,
"Cannot parse shell files: %s",
econf_errString(error));