diff options
author | Thorsten Kukuk <kukuk@thkukuk.de> | 2005-11-18 08:57:01 +0000 |
---|---|---|
committer | Thorsten Kukuk <kukuk@thkukuk.de> | 2005-11-18 08:57:01 +0000 |
commit | 2c8f29d463d8184a0a1538088de4380d3b2bcfc2 (patch) | |
tree | a838f8cf9841e97dcbaf49b2073d051166c8bb7c /libpam | |
parent | 781bbbc5dbe056f8fd9af6072a0eb30c7d073ef0 (diff) | |
download | pam-2c8f29d463d8184a0a1538088de4380d3b2bcfc2.tar.gz pam-2c8f29d463d8184a0a1538088de4380d3b2bcfc2.tar.bz2 pam-2c8f29d463d8184a0a1538088de4380d3b2bcfc2.zip |
Relevant BUGIDs: 534205
Purpose of commit: new feature
Commit summary:
---------------
2005-11-16 Thorsten Kukuk <kukuk@thkukuk.de>
* libpam/pam_handlers.c: Replace code for all dlopen variants with
a generic wrapper.
* libpam/pam_dynamic.c: Implement generic wrapper for dlopen.
* libpam/pam_dynamic.h: Provide prototypes.
For Mac OS X support [#534205]
Diffstat (limited to 'libpam')
-rw-r--r-- | libpam/Makefile.am | 7 | ||||
-rw-r--r-- | libpam/pam_handlers.c | 92 |
2 files changed, 21 insertions, 78 deletions
diff --git a/libpam/Makefile.am b/libpam/Makefile.am index d7472b71..f609f8a7 100644 --- a/libpam/Makefile.am +++ b/libpam/Makefile.am @@ -13,9 +13,10 @@ EXTRA_DIST = libpam.map include_HEADERS = $(addprefix include/security/, _pam_compat.h _pam_macros.h _pam_types.h \ pam_appl.h pam_malloc.h pam_modules.h pam_ext.h pam_modutil.h) -noinst_HEADERS = pam_prelude.h pam_private.h pam_tokens.h pam_modutil_private.h +noinst_HEADERS = pam_dynamic.h pam_prelude.h pam_private.h pam_tokens.h \ + pam_modutil_private.h -libpam_la_LDFLAGS = -no-undefined -version-info 81:0:81 +libpam_la_LDFLAGS = -no-undefined -version-info 81:1:81 if HAVE_VERSIONING libpam_la_LDFLAGS += -Wl,--version-script=$(srcdir)/libpam.map endif @@ -26,7 +27,7 @@ libpam_la_SOURCES = pam_account.c pam_auth.c pam_data.c pam_delay.c \ pam_dispatch.c pam_end.c pam_env.c pam_handlers.c pam_item.c \ pam_malloc.c pam_misc.c pam_password.c pam_prelude.c \ pam_session.c pam_start.c pam_static.c pam_strerror.c \ - pam_vprompt.c pam_syslog.c \ + pam_vprompt.c pam_syslog.c pam_dynamic.c \ pam_modutil_cleanup.c pam_modutil_getpwnam.c pam_modutil_ioloop.c \ pam_modutil_getgrgid.c pam_modutil_getpwuid.c pam_modutil_getgrnam.c \ pam_modutil_getspnam.c pam_modutil_getlogin.c pam_modutil_ingroup.c diff --git a/libpam/pam_handlers.c b/libpam/pam_handlers.c index 04c6ff17..1b5b9416 100644 --- a/libpam/pam_handlers.c +++ b/libpam/pam_handlers.c @@ -19,18 +19,9 @@ #include <unistd.h> #ifdef PAM_DYNAMIC -# ifdef PAM_SHL -# include <dl.h> -# else /* PAM_SHL */ -# include <dlfcn.h> -# endif /* PAM_SHL */ +#include "pam_dynamic.h" #endif /* PAM_DYNAMIC */ -/* If not required, define as nothing */ -#ifndef SHLIB_SYM_PREFIX -# define SHLIB_SYM_PREFIX "" -#endif - #define BUF_SIZE 1024 #define MODULE_CHUNK 4 #define UNKNOWN_MODULE_PATH "<*unknown module path*>" @@ -596,8 +587,6 @@ extract_modulename(const char *mod_path) return retval; } -typedef int (*servicefn)(pam_handle_t *, int, int, char **); - int _pam_add_handler(pam_handle_t *pamh , int must_fail, int other, int type , int *actions, const char *mod_path @@ -609,9 +598,6 @@ int _pam_add_handler(pam_handle_t *pamh struct handler **handler_p2; struct handlers *the_handlers; const char *sym, *sym2; -#ifdef PAM_SHL - const char *_sym, *_sym2; -#endif char *mod_full_path=NULL; #ifdef PAM_DYNAMIC char *mod_full_isa_path=NULL, *isa=NULL; @@ -671,13 +657,9 @@ int _pam_add_handler(pam_handle_t *pamh success = PAM_ABORT; #ifdef PAM_DYNAMIC - D(("_pam_add_handler: dlopen(%s) -> %lx", mod_path, &mod->dl_handle)); - mod->dl_handle = -# ifdef PAM_SHL - shl_load(mod_path, BIND_IMMEDIATE, 0L); -# else /* PAM_SHL */ - dlopen(mod_path, RTLD_NOW); -# endif /* PAM_SHL */ + D(("_pam_add_handler: _pam_dlopen(%s)", mod_path)); + mod->dl_handle = _pam_dlopen(mod_path); + D(("_pam_add_handler: _pam_dlopen'ed")); D(("_pam_add_handler: dlopen'ed")); if (mod->dl_handle == NULL) { if (strstr(mod_path, "$ISA")) { @@ -693,22 +675,15 @@ int _pam_add_handler(pam_handle_t *pamh memmove(isa + strlen(_PAM_ISA), isa + 4, strlen(isa + 4) + 1); memmove(isa, _PAM_ISA, strlen(_PAM_ISA)); } - mod->dl_handle = -# ifdef PAM_SHL - shl_load(mod_full_isa_path, BIND_IMMEDIATE, 0L); -# else /* PAM_SHL */ - dlopen(mod_full_isa_path, RTLD_NOW); -# endif /* PAM_SHL */ + mod->dl_handle = _pam_dlopen(mod_full_isa_path); _pam_drop(mod_full_isa_path); } } } if (mod->dl_handle == NULL) { - D(("_pam_add_handler: dlopen(%s) failed", mod_path)); + D(("_pam_add_handler: _pam_dlopen(%s) failed", mod_path)); pam_syslog(pamh, LOG_ERR, "unable to dlopen(%s)", mod_path); -# ifndef PAM_SHL - pam_syslog(pamh, LOG_ERR, "[dlerror: %s]", dlerror()); -# endif /* PAM_SHL */ + pam_syslog(pamh, LOG_ERR, "[error: %s]", _pam_dlerror()); /* Don't abort yet; static code may be able to find function. * But defaults to abort if nothing found below... */ } else { @@ -779,46 +754,29 @@ int _pam_add_handler(pam_handle_t *pamh handler_p = handler_p2 = NULL; func = func2 = NULL; -#ifdef PAM_SHL - _sym2 = -#endif /* PAM_SHL */ sym2 = NULL; /* point handler_p's at the root addresses of the function stacks */ switch (type) { case PAM_T_AUTH: handler_p = &the_handlers->authenticate; - sym = SHLIB_SYM_PREFIX "pam_sm_authenticate"; + sym = "pam_sm_authenticate"; handler_p2 = &the_handlers->setcred; - sym2 = SHLIB_SYM_PREFIX "pam_sm_setcred"; -#ifdef PAM_SHL - _sym = "_pam_sm_authenticate"; - _sym2 = "_pam_sm_setcred"; -#endif + sym2 = "pam_sm_setcred"; break; case PAM_T_SESS: handler_p = &the_handlers->open_session; - sym = SHLIB_SYM_PREFIX "pam_sm_open_session"; + sym = "pam_sm_open_session"; handler_p2 = &the_handlers->close_session; - sym2 = SHLIB_SYM_PREFIX "pam_sm_close_session"; -#ifdef PAM_SHL - _sym = "_pam_sm_open_session"; - _sym2 = "_pam_sm_close_session"; -#endif + sym2 = "pam_sm_close_session"; break; case PAM_T_ACCT: handler_p = &the_handlers->acct_mgmt; - sym = SHLIB_SYM_PREFIX "pam_sm_acct_mgmt"; -#ifdef PAM_SHL - _sym = "_pam_sm_acct_mgmt"; -#endif + sym = "pam_sm_acct_mgmt"; break; case PAM_T_PASS: handler_p = &the_handlers->chauthtok; - sym = SHLIB_SYM_PREFIX "pam_sm_chauthtok"; -#ifdef PAM_SHL - _sym = "_pam_sm_chauthtok"; -#endif + sym = "pam_sm_chauthtok"; break; default: /* Illegal module type */ @@ -848,14 +806,8 @@ int _pam_add_handler(pam_handle_t *pamh /* now identify this module's functions - for non-faulty modules */ #ifdef PAM_DYNAMIC - if ((mod->type == PAM_MT_DYNAMIC_MOD) && -# ifdef PAM_SHL - (shl_findsym(&mod->dl_handle, sym, (short) TYPE_PROCEDURE, &func) && - shl_findsym(&mod->dl_handle, _sym, (short) TYPE_PROCEDURE, &func)) -# else /* PAM_SHL */ - (func = (servicefn) dlsym(mod->dl_handle, sym)) == NULL -# endif /* PAM_SHL */ - ) { + if ((mod->type == PAM_MT_DYNAMIC_MOD) && + !(func = _pam_dlsym(mod->dl_handle, sym)) ) { pam_syslog(pamh, LOG_ERR, "unable to resolve symbol: %s", sym); } #endif @@ -868,13 +820,7 @@ int _pam_add_handler(pam_handle_t *pamh if (sym2) { #ifdef PAM_DYNAMIC if ((mod->type == PAM_MT_DYNAMIC_MOD) && -# ifdef PAM_SHL - (shl_findsym(&mod->dl_handle,sym2,(short)TYPE_PROCEDURE, &func2)&& - shl_findsym(&mod->dl_handle,_sym2,(short)TYPE_PROCEDURE, &func2)) -# else /* PAM_SHL */ - (func2 = (servicefn) dlsym(mod->dl_handle, sym2)) == NULL -# endif /* PAM_SHL */ - ) { + !(func2 = _pam_dlsym(mod->dl_handle, sym2)) ) { pam_syslog(pamh, LOG_ERR, "unable to resolve symbol: %s", sym2); } #endif @@ -963,11 +909,7 @@ int _pam_free_handlers(pam_handle_t *pamh) free(mod->name); #ifdef PAM_DYNAMIC if (mod->type == PAM_MT_DYNAMIC_MOD) { -# ifdef PAM_SHL - shl_unload(mod->dl_handle); -# else - dlclose(mod->dl_handle); -# endif + _pam_dlclose(mod->dl_handle); } #endif mod++; |