aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpam/pam_handlers.c18
1 files changed, 5 insertions, 13 deletions
diff --git a/libpam/pam_handlers.c b/libpam/pam_handlers.c
index 08930386..bb6268b3 100644
--- a/libpam/pam_handlers.c
+++ b/libpam/pam_handlers.c
@@ -9,6 +9,7 @@
#include "pam_private.h"
#include "pam_inline.h"
+#include <limits.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
@@ -734,23 +735,14 @@ _pam_load_module(pam_handle_t *pamh, const char *mod_path, int handler_type)
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) {
+ char *mod_full_isa_path = NULL;
+ if (strlen(mod_path) >= INT_MAX ||
+ asprintf(&mod_full_isa_path, "%.*s%s%s",
+ (int)(isa - mod_path), mod_path, _PAM_ISA, isa + isa_len) < 0) {
D(("couldn't get memory for mod_path"));
pam_syslog(pamh, LOG_CRIT, "no memory for module path");
success = PAM_ABORT;
} else {
- 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);
}