diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-03-24 23:58:04 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-03-24 23:58:04 +0000 |
commit | cfce6f886cb7b6632a0cca37c0388c81b3390cb6 (patch) | |
tree | 31409711ecc896d7002c91b3b3e92a1e5c8e1aac /libpam/pam_handlers.c | |
parent | ba8d131a2e3179dc5787faf5cba1672f507af85b (diff) | |
download | pam-cfce6f886cb7b6632a0cca37c0388c81b3390cb6.tar.gz pam-cfce6f886cb7b6632a0cca37c0388c81b3390cb6.tar.bz2 pam-cfce6f886cb7b6632a0cca37c0388c81b3390cb6.zip |
_pam_load_module: reduce redundancy
* libpam/pam_handlers.c (_pam_load_module): Reorganize $ISA handling
to reduce redundancy.
Resolves: https://github.com/linux-pam/linux-pam/pull/198
Diffstat (limited to 'libpam/pam_handlers.c')
-rw-r--r-- | libpam/pam_handlers.c | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/libpam/pam_handlers.c b/libpam/pam_handlers.c index 9c733681..79961ed2 100644 --- a/libpam/pam_handlers.c +++ b/libpam/pam_handlers.c @@ -673,7 +673,6 @@ _pam_load_module(pam_handle_t *pamh, const char *mod_path, int handler_type) { int x = 0; int success; - char *mod_full_isa_path=NULL, *isa=NULL; struct loaded_module *mod; D(("_pam_load_module: loading module `%s'", mod_path)); @@ -712,19 +711,27 @@ _pam_load_module(pam_handle_t *pamh, const char *mod_path, int handler_type) D(("_pam_load_module: _pam_dlopen'ed")); D(("_pam_load_module: dlopen'ed")); if (mod->dl_handle == NULL) { - if (strstr(mod_path, "$ISA")) { - mod_full_isa_path = malloc(strlen(mod_path) + strlen(_PAM_ISA) + 1); + const char *isa = strstr(mod_path, "$ISA"); + size_t isa_len = strlen("$ISA"); + + if (isa != NULL) { + size_t pam_isa_len = strlen(_PAM_ISA); + char *mod_full_isa_path = + malloc(strlen(mod_path) - isa_len + pam_isa_len + 1); + if (mod_full_isa_path == NULL) { D(("_pam_load_module: couldn't get memory for mod_path")); pam_syslog(pamh, LOG_CRIT, "no memory for module path"); success = PAM_ABORT; } else { - strcpy(mod_full_isa_path, mod_path); - isa = strstr(mod_full_isa_path, "$ISA"); - if (isa) { - memmove(isa + strlen(_PAM_ISA), isa + 4, strlen(isa + 4) + 1); - memmove(isa, _PAM_ISA, strlen(_PAM_ISA)); - } + char *p = mod_full_isa_path; + + memcpy(p, mod_path, isa - mod_path); + p += isa - mod_path; + memcpy(p, _PAM_ISA, pam_isa_len); + p += pam_isa_len; + strcpy(p, isa + isa_len); + mod->dl_handle = _pam_dlopen(mod_full_isa_path); _pam_drop(mod_full_isa_path); } |