diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-07-04 18:28:28 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2012-07-04 19:06:13 +0300 |
commit | 3da6891d134048d9885b00776a36b1e6153d6a14 (patch) | |
tree | 410105d22865e6c2b20b7754fb1c0bb7be88c685 /pam_umotd | |
parent | 3ef9904a2217d88ca48e24923c43d2ef17753274 (diff) | |
download | pam-modules-3da6891d134048d9885b00776a36b1e6153d6a14.tar.gz pam-modules-3da6891d134048d9885b00776a36b1e6153d6a14.tar.bz2 |
Bugfixes.
* acinclude.m4 (PM_ENABLE): Don't test $build_$1 variable
before its initialization.
* pam_umotd/pam_umotd.c: Remove unnecessary includes.
(exec_file): Argv is not const.
(pam_sm_open_session): PAM does not guarantee that
argv[] is null-terminated. Create a null-terminated copy
for use by exec_file.
Diffstat (limited to 'pam_umotd')
-rw-r--r-- | pam_umotd/pam_umotd.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/pam_umotd/pam_umotd.c b/pam_umotd/pam_umotd.c index 639c4d1..2fcd2dc 100644 --- a/pam_umotd/pam_umotd.c +++ b/pam_umotd/pam_umotd.c @@ -33,9 +33,6 @@ #include <stdio.h> #include <stdlib.h> #include <unistd.h> -#include <ldap.h> -#include <pwd.h> -#include <grp.h> #include <signal.h> #include <time.h> @@ -126,7 +123,7 @@ read_file(pam_handle_t *pamh, const char *file) } static int -exec_file(pam_handle_t *pamh, const char **argv, const char *logfile) +exec_file(pam_handle_t *pamh, char **argv, const char *logfile) { pid_t pid, rc; int p[2]; @@ -172,7 +169,7 @@ exec_file(pam_handle_t *pamh, const char **argv, const char *logfile) } else dup2(1, 2); - execv(argv[0], (char**)argv); + execv(argv[0], argv); _exit(127); } @@ -300,6 +297,7 @@ pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) gray_slist_free(&slist); } else if (optindex >= 0) { int i; + char **xargv; argc -= optindex; argv += optindex; @@ -307,13 +305,16 @@ pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) _pam_log(LOG_INFO, "empty command line"); return retval; } + xargv = gray_malloc((argc + 1) * sizeof (xargv[0])); slist = gray_slist_create(); for (i = 0; i < argc; i++) { gray_expand_string(pamh, argv[i], slist); gray_slist_append_char(slist, 0); - argv[i] = gray_slist_finish(slist); + xargv[i] = gray_slist_finish(slist); } - retval = exec_file(pamh, argv, logfile_name); + xargv[i] = NULL; + retval = exec_file(pamh, xargv, logfile_name); + free(xargv); gray_slist_free(&slist); } else _pam_log(LOG_ERR, |