summaryrefslogtreecommitdiff
path: root/libpam
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-03-24 23:58:04 +0000
committerDmitry V. Levin <ldv@altlinux.org>2020-03-24 23:58:04 +0000
commitcfce6f886cb7b6632a0cca37c0388c81b3390cb6 (patch)
tree31409711ecc896d7002c91b3b3e92a1e5c8e1aac /libpam
parentba8d131a2e3179dc5787faf5cba1672f507af85b (diff)
_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')
-rw-r--r--libpam/pam_handlers.c25
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);
}