summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpam/pam_handlers.c34
1 files changed, 22 insertions, 12 deletions
diff --git a/libpam/pam_handlers.c b/libpam/pam_handlers.c
index c7045d26..dc5f81fa 100644
--- a/libpam/pam_handlers.c
+++ b/libpam/pam_handlers.c
@@ -737,7 +737,27 @@ _pam_load_module(pam_handle_t *pamh, const char *mod_path, int handler_type)
success = PAM_ABORT;
D(("_pam_load_module: _pam_dlopen(%s)", mod_path));
- mod->dl_handle = _pam_dlopen(mod_path);
+ if (mod_path[0] == '/') {
+ mod->dl_handle = _pam_dlopen(mod_path);
+ } else {
+ char *mod_full_path = NULL;
+ if (asprintf(&mod_full_path, "%s%s",
+ DEFAULT_MODULE_PATH, mod_path) >= 0) {
+ mod->dl_handle = _pam_dlopen(mod_full_path);
+ _pam_drop(mod_full_path);
+ } else {
+ pam_syslog(pamh, LOG_CRIT, "cannot malloc full mod path");
+ }
+ if (!mod->dl_handle) {
+ if (asprintf(&mod_full_path, "%s/%s",
+ _PAM_ISA, mod_path) >= 0) {
+ mod->dl_handle = _pam_dlopen(mod_full_path);
+ _pam_drop(mod_full_path);
+ } else {
+ pam_syslog(pamh, LOG_CRIT, "cannot malloc full mod path");
+ }
+ }
+ }
D(("_pam_load_module: _pam_dlopen'ed"));
D(("_pam_load_module: dlopen'ed"));
if (mod->dl_handle == NULL) {
@@ -814,7 +834,6 @@ int _pam_add_handler(pam_handle_t *pamh
struct handler **handler_p2;
struct handlers *the_handlers;
const char *sym, *sym2;
- char *mod_full_path;
servicefn func, func2;
int mod_type = PAM_MT_FAULTY_MOD;
@@ -826,16 +845,7 @@ int _pam_add_handler(pam_handle_t *pamh
if ((handler_type == PAM_HT_MODULE || handler_type == PAM_HT_SILENT_MODULE) &&
mod_path != NULL) {
- if (mod_path[0] == '/') {
- mod = _pam_load_module(pamh, mod_path, handler_type);
- } else if (asprintf(&mod_full_path, "%s%s",
- DEFAULT_MODULE_PATH, mod_path) >= 0) {
- mod = _pam_load_module(pamh, mod_full_path, handler_type);
- _pam_drop(mod_full_path);
- } else {
- pam_syslog(pamh, LOG_CRIT, "cannot malloc full mod path");
- return PAM_ABORT;
- }
+ mod = _pam_load_module(pamh, mod_path, handler_type);
if (mod == NULL) {
/* if we get here with NULL it means allocation error */