components/openssh/patches/041-pam_ctx_preserve.patch
author Jan Parcel <jan.parcel@oracle.com>
Wed, 16 Nov 2016 12:17:49 -0800
branchs11u3-sru
changeset 7320 edeb951aa980
parent 6077 db9eab3e96fe
child 7649 69d7508f0d66
permissions -rw-r--r--
24525860 upgrade OpenSSH to 7.3p1 24320031 problem in UTILITY/OPENSSH 24461706 problem in UTILITY/OPENSSH 24752716 Eliminate hard-to-maintain manpages section-number patch in openssh 11.3SRU 15366793 sshd calls pam_authenticate() for none method if PermitEmptyPasswords=yes 24597931 PAM_BUGFIX by-passes fake password for timing attack avoidance 23223069 problem in UTILITY/OPENSSH 24923674 problem in UTILITY/OPENSSH 23577308 OpenSSH Makefile: -DWITHOUT_ED25519 left behind 23140756 openssh passes bad option to configure (--with-tcp-wrappers) 24301902 Log connections dropped when exceeding MaxStartups
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     1
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     2
# Make pam_set_data/pam_get_data work with OpenSSH
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     3
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     4
# The way PAM is implemented in OpenSSH makes pam_set_data unusable
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     5
# for passing data between PAM stacks.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     6
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     7
# The problem is, that pam_authenticate and pam_acct_mgmt are called
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     8
# in a separate auxiliary process. Any data stored using pam_set_data
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
     9
# and any  other state information stored by those two functions are
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    10
# lost when the auxiliary process exits (with exceptions like
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    11
# environment variables, which are sent over between the processes).
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    12
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    13
# This patch fixes this by switching the roles of the monitor and the
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    14
# auxiliary process when doing PAM authentication. In the new code the
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    15
# monitor will be the one calling pam_authenticate and pam_acct_mgmt
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    16
# (eventually blocking and calling callbacks), whereas the other
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    17
# process (callback child) will be sending messages to the client
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    18
# (either directly or through privsep child).
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    19
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    20
# Patch origin: in-house
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    21
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    22
# Reported upstream:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    23
# https://bugzilla.mindrot.org/show_bug.cgi?id=2548
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    24
#
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    25
diff -pur old/auth-pam.c new/auth-pam.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    26
--- old/auth-pam.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    27
+++ new/auth-pam.c
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    28
@@ -98,6 +98,7 @@
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    29
 #include "ssh-gss.h"
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    30
 #endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    31
 #include "monitor_wrap.h"
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    32
+#include "ssherr.h"
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    33
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    34
 extern ServerOptions options;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    35
 extern Buffer loginmsg;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    36
@@ -110,38 +111,26 @@ extern u_int utmp_len;
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    37
 #endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    38
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    39
 /*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    40
- * Formerly known as USE_POSIX_THREADS, using this is completely unsupported
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    41
- * and generally a bad idea.  Use at own risk and do not expect support if
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    42
- * this breaks.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    43
+ * PAM processing model has been rewritten.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    44
+ * Now all the calls to PAM are within the monitor process,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    45
+ * pam_get_data/pam_set_data works as designed and there is no need
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    46
+ * for the threads anymore.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    47
  */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    48
 #ifdef UNSUPPORTED_POSIX_THREADS_HACK
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    49
-#include <pthread.h>
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    50
-/*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    51
- * Avoid namespace clash when *not* using pthreads for systems *with*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    52
- * pthreads, which unconditionally define pthread_t via sys/types.h
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    53
- * (e.g. Linux)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    54
- */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    55
-typedef pthread_t sp_pthread_t;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    56
-#else
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    57
-typedef pid_t sp_pthread_t;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    58
+# error "UNSUPPORTED_POSIX_THREADS_HACK no longer supported"
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    59
 #endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    60
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    61
 struct pam_ctxt {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    62
-	sp_pthread_t	 pam_thread;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    63
-	int		 pam_psock;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    64
-	int		 pam_csock;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    65
-	int		 pam_done;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    66
+	pid_t	 pam_child;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    67
+	int	 pam_psock;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    68
+	int	 pam_csock;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    69
+	int	 pam_done;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    70
 };
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    71
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    72
 static void sshpam_free_ctx(void *);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    73
 static struct pam_ctxt *cleanup_ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    74
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    75
-#ifndef UNSUPPORTED_POSIX_THREADS_HACK
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    76
-/*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    77
- * Simulate threads with processes.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    78
- */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    79
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    80
-static int sshpam_thread_status = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    81
+static int sshpam_child_status = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    82
 static mysig_t sshpam_oldsig;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    83
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    84
 static void
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    85
@@ -150,85 +139,25 @@ sshpam_sigchld_handler(int sig)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    86
 	signal(SIGCHLD, SIG_DFL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    87
 	if (cleanup_ctxt == NULL)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    88
 		return;	/* handler called after PAM cleanup, shouldn't happen */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    89
-	if (waitpid(cleanup_ctxt->pam_thread, &sshpam_thread_status, WNOHANG)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    90
+	if (waitpid(cleanup_ctxt->pam_child, &sshpam_child_status, WNOHANG)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    91
 	    <= 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    92
-		/* PAM thread has not exitted, privsep slave must have */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    93
-		kill(cleanup_ctxt->pam_thread, SIGTERM);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    94
-		while (waitpid(cleanup_ctxt->pam_thread,
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    95
-		    &sshpam_thread_status, 0) == -1) {
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    96
+		/* callback child has not exited, privsep slave must have */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
    97
+		kill(cleanup_ctxt->pam_child, SIGTERM);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    98
+		while (waitpid(cleanup_ctxt->pam_child,
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
    99
+		    &sshpam_child_status, 0) == -1) {
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   100
 			if (errno == EINTR)
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   101
 				continue;
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   102
 			return;
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   103
 		}
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   104
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   105
-	if (WIFSIGNALED(sshpam_thread_status) &&
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   106
-	    WTERMSIG(sshpam_thread_status) == SIGTERM)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   107
-		return;	/* terminated by pthread_cancel */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   108
-	if (!WIFEXITED(sshpam_thread_status))
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   109
-		sigdie("PAM: authentication thread exited unexpectedly");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   110
-	if (WEXITSTATUS(sshpam_thread_status) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   111
-		sigdie("PAM: authentication thread exited uncleanly");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   112
-}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   113
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   114
-/* ARGSUSED */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   115
-static void
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   116
-pthread_exit(void *value)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   117
-{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   118
-	_exit(0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   119
-}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   120
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   121
-/* ARGSUSED */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   122
-static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   123
-pthread_create(sp_pthread_t *thread, const void *attr,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   124
-    void *(*thread_start)(void *), void *arg)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   125
-{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   126
-	pid_t pid;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   127
-	struct pam_ctxt *ctx = arg;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   128
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   129
-	sshpam_thread_status = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   130
-	switch ((pid = fork())) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   131
-	case -1:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   132
-		error("fork(): %s", strerror(errno));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   133
-		return (-1);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   134
-	case 0:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   135
-		close(ctx->pam_psock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   136
-		ctx->pam_psock = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   137
-		thread_start(arg);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   138
-		_exit(1);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   139
-	default:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   140
-		*thread = pid;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   141
-		close(ctx->pam_csock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   142
-		ctx->pam_csock = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   143
-		sshpam_oldsig = signal(SIGCHLD, sshpam_sigchld_handler);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   144
-		return (0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   145
-	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   146
-}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   147
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   148
-static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   149
-pthread_cancel(sp_pthread_t thread)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   150
-{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   151
-	signal(SIGCHLD, sshpam_oldsig);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   152
-	return (kill(thread, SIGTERM));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   153
-}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   154
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   155
-/* ARGSUSED */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   156
-static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   157
-pthread_join(sp_pthread_t thread, void **value)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   158
-{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   159
-	int status;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   160
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   161
-	if (sshpam_thread_status != -1)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   162
-		return (sshpam_thread_status);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   163
-	signal(SIGCHLD, sshpam_oldsig);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   164
-	while (waitpid(thread, &status, 0) == -1) {
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   165
-		if (errno == EINTR)
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   166
-			continue;
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   167
-		fatal("%s: waitpid: %s", __func__, strerror(errno));
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   168
-	}
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   169
-	return (status);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   170
+	if (WIFSIGNALED(sshpam_child_status) &&
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   171
+	    WTERMSIG(sshpam_child_status) == SIGTERM)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   172
+		return;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   173
+	if (!WIFEXITED(sshpam_child_status))
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   174
+		sigdie("PAM: callback child exited unexpectedly");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   175
+	if (WEXITSTATUS(sshpam_child_status) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   176
+		sigdie("PAM: callback child exited uncleanly");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   177
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   178
-#endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   179
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   180
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   181
 static pam_handle_t *sshpam_handle = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   182
 static int sshpam_err = 0;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   183
@@ -298,55 +227,11 @@ sshpam_password_change_required(int reqd
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   184
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   185
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   186
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   187
-/* Import regular and PAM environment from subprocess */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   188
-static void
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   189
-import_environments(Buffer *b)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   190
-{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   191
-	char *env;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   192
-	u_int i, num_env;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   193
-	int err;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   194
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   195
-	debug3("PAM: %s entering", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   196
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   197
-#ifndef UNSUPPORTED_POSIX_THREADS_HACK
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   198
-	/* Import variables set by do_pam_account */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   199
-	sshpam_account_status = buffer_get_int(b);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   200
-	sshpam_password_change_required(buffer_get_int(b));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   201
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   202
-	/* Import environment from subprocess */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   203
-	num_env = buffer_get_int(b);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   204
-	if (num_env > 1024)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   205
-		fatal("%s: received %u environment variables, expected <= 1024",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   206
-		    __func__, num_env);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   207
-	sshpam_env = xcalloc(num_env + 1, sizeof(*sshpam_env));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   208
-	debug3("PAM: num env strings %d", num_env);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   209
-	for(i = 0; i < num_env; i++)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   210
-		sshpam_env[i] = buffer_get_string(b, NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   211
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   212
-	sshpam_env[num_env] = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   213
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   214
-	/* Import PAM environment from subprocess */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   215
-	num_env = buffer_get_int(b);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   216
-	debug("PAM: num PAM env strings %d", num_env);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   217
-	for(i = 0; i < num_env; i++) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   218
-		env = buffer_get_string(b, NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   219
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   220
-#ifdef HAVE_PAM_PUTENV
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   221
-		/* Errors are not fatal here */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   222
-		if ((err = pam_putenv(sshpam_handle, env)) != PAM_SUCCESS) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   223
-			error("PAM: pam_putenv: %s",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   224
-			    pam_strerror(sshpam_handle, sshpam_err));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   225
-		}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   226
-#endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   227
-	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   228
-#endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   229
-}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   230
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   231
 /*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   232
- * Conversation function for authentication thread.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   233
+ * Conversation function for keyboard-interactive authentication.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   234
  */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   235
 static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   236
-sshpam_thread_conv(int n, sshpam_const struct pam_message **msg,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   237
+sshpam_child_conv(int n, sshpam_const struct pam_message **msg,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   238
     struct pam_response **resp, void *data)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   239
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   240
 	Buffer buffer;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   241
@@ -411,48 +296,85 @@ sshpam_thread_conv(int n, sshpam_const s
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   242
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   243
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   244
 /*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   245
- * Authentication thread.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   246
+ * Terminates the call back child.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   247
+ *
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   248
+ * Sends a message of type PAM_SUCCESS or PAM_AUTH_ERR to the child.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   249
+ * In response receives a message with remaining PAM prompts.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   250
+ * When not using privilege separation, receives serialized packet state too.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   251
+ *
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   252
+ * After that, the child exits.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   253
  */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   254
-static void *
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   255
-sshpam_thread(void *ctxtp)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   256
+void
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   257
+relieve_from_duty(struct pam_ctxt *ctxt)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   258
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   259
-	struct pam_ctxt *ctxt = ctxtp;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   260
 	Buffer buffer;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   261
-	struct pam_conv sshpam_conv;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   262
-	int flags = (options.permit_empty_passwd == 0 ?
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   263
-	    PAM_DISALLOW_NULL_AUTHTOK : 0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   264
-#ifndef UNSUPPORTED_POSIX_THREADS_HACK
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   265
-	extern char **environ;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   266
-	char **env_from_pam;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   267
-	u_int i;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   268
-	const char *pam_user;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   269
-	const char **ptr_pam_user = &pam_user;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   270
-	char *tz = getenv("TZ");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   271
+	struct ssh *ssh = active_state;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   272
+	int r;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   273
+	u_char type;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   274
+	char *msg;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   275
+	u_int len;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   276
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   277
-	sshpam_err = pam_get_item(sshpam_handle, PAM_USER,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   278
-	    (sshpam_const void **)ptr_pam_user);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   279
-	if (sshpam_err != PAM_SUCCESS)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   280
-		goto auth_fail;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   281
+	buffer_init(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   282
+	buffer_put_cstring(&buffer, "OK");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   283
+	type = (ctxt->pam_done == 1) ? PAM_SUCCESS : PAM_AUTH_ERR;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   284
+	if (ssh_msg_send(ctxt->pam_csock, type, &buffer) == -1) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   285
+		buffer_free(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   286
+		fatal("%s: cannnot terminate callback child (send)", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   287
+	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   288
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   289
-	environ[0] = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   290
-	if (tz != NULL)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   291
-		if (setenv("TZ", tz, 1) == -1)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   292
-			error("PAM: could not set TZ environment: %s",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   293
-			    strerror(errno));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   294
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   295
-	if (sshpam_authctxt != NULL) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   296
-		setproctitle("%s [pam]",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   297
-		    sshpam_authctxt->valid ? pam_user : "unknown");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   298
+	buffer_clear(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   299
+	if (ssh_msg_recv(ctxt->pam_csock, &buffer) == -1) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   300
+		buffer_free(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   301
+		fatal("%s: cannnot terminate callback child (receive)",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   302
+		    __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   303
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   304
-#endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   305
+	type = buffer_get_char(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   306
+	msg = buffer_get_cstring(&buffer, &len);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   307
+	if (len)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   308
+		buffer_append(&loginmsg, msg, len);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   309
+	/* if not using privsep child, sync packet state from callback child */	
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   310
+	if (!use_privsep) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   311
+		if ((r = ssh_packet_set_state(ssh, &buffer)) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   312
+			fatal("%s: set_state failed: %s",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   313
+			   __func__, ssh_err(r));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   314
+	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   315
+	free(msg);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   316
+	buffer_free(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   317
+	close(ctxt->pam_csock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   318
+	ctxt->pam_csock = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   319
+}
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   320
 
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   321
-	sshpam_conv.conv = sshpam_thread_conv;
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   322
+int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   323
+get_pam_done(void *ctxt)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   324
+{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   325
+	struct pam_ctxt *pctxt = (struct pam_ctxt *)ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   326
+	return (pctxt->pam_done);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   327
+}
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   328
+
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   329
+/*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   330
+ * Perform PAM authentication.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   331
+ *
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   332
+ * PAM APIs (pam_authenticate, pam_acct_mgmt, ...) block and call the
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   333
+ * provided callback conversation function (sshpam_conv). The conversation
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   334
+ * function sends messages to the callback child (pam_ctxt.pam_child), which
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   335
+ * communicates with the client directly, or indirectly through privsep child.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   336
+ */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   337
+void
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   338
+do_pam_auth(struct pam_ctxt *ctxt)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   339
+{
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   340
+	struct pam_conv sshpam_conv;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   341
+	int flags = (options.permit_empty_passwd == 0 ?
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   342
+	    PAM_DISALLOW_NULL_AUTHTOK : 0);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   343
+	struct ssh *ssh = active_state; /* XXX */
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   344
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   345
+	sshpam_conv.conv = sshpam_child_conv;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   346
 	sshpam_conv.appdata_ptr = ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   347
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   348
+	ctxt->pam_done = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   349
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   350
 	if (sshpam_authctxt == NULL)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   351
 		fatal("%s: PAM authctxt not initialized", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   352
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   353
-	buffer_init(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   354
 	sshpam_err = pam_set_item(sshpam_handle, PAM_CONV,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   355
 	    (const void *)&sshpam_conv);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   356
 	if (sshpam_err != PAM_SUCCESS)
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   357
@@ -477,63 +399,35 @@ sshpam_thread(void *ctxtp)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   358
 		}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   359
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   360
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   361
-	buffer_put_cstring(&buffer, "OK");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   362
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   363
-#ifndef UNSUPPORTED_POSIX_THREADS_HACK
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   364
-	/* Export variables set by do_pam_account */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   365
-	buffer_put_int(&buffer, sshpam_account_status);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   366
-	buffer_put_int(&buffer, sshpam_authctxt->force_pwchange);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   367
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   368
-	/* Export any environment strings set in child */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   369
-	for(i = 0; environ[i] != NULL; i++)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   370
-		; /* Count */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   371
-	buffer_put_int(&buffer, i);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   372
-	for(i = 0; environ[i] != NULL; i++)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   373
-		buffer_put_cstring(&buffer, environ[i]);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   374
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   375
-	/* Export any environment strings set by PAM in child */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   376
-	env_from_pam = pam_getenvlist(sshpam_handle);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   377
-	for(i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   378
-		; /* Count */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   379
-	buffer_put_int(&buffer, i);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   380
-	for(i = 0; env_from_pam != NULL && env_from_pam[i] != NULL; i++)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   381
-		buffer_put_cstring(&buffer, env_from_pam[i]);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   382
-#endif /* UNSUPPORTED_POSIX_THREADS_HACK */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   383
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   384
-	/* XXX - can't do much about an error here */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   385
-	ssh_msg_send(ctxt->pam_csock, sshpam_err, &buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   386
-	buffer_free(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   387
-	pthread_exit(NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   388
+	ctxt->pam_done = 1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   389
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   390
  auth_fail:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   391
-	buffer_put_cstring(&buffer,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   392
-	    pam_strerror(sshpam_handle, sshpam_err));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   393
-	/* XXX - can't do much about an error here */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   394
-	if (sshpam_err == PAM_ACCT_EXPIRED)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   395
-		ssh_msg_send(ctxt->pam_csock, PAM_ACCT_EXPIRED, &buffer);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   396
-	else if (sshpam_maxtries_reached)
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   397
-		ssh_msg_send(ctxt->pam_csock, PAM_MAXTRIES, &buffer);
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   398
-	else
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   399
-		ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, &buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   400
-	buffer_free(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   401
-	pthread_exit(NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   402
-
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   403
-	return (NULL); /* Avoid warning for non-pthread case */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   404
+	if (sshpam_err != PAM_SUCCESS)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   405
+		error("PAM: %s for %s%.100s from %.100s",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   406
+		    pam_strerror(sshpam_handle, sshpam_err),
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   407
+		    sshpam_authctxt->valid ? "" : "illegal user ",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   408
+		    sshpam_authctxt->user,
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   409
+		    auth_get_canonical_hostname(ssh, options.use_dns));
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   410
+	relieve_from_duty(ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   411
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   412
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   413
 void
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   414
-sshpam_thread_cleanup(void)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   415
+sshpam_child_cleanup(void)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   416
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   417
 	struct pam_ctxt *ctxt = cleanup_ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   418
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   419
 	debug3("PAM: %s entering", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   420
-	if (ctxt != NULL && ctxt->pam_thread != 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   421
-		pthread_cancel(ctxt->pam_thread);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   422
-		pthread_join(ctxt->pam_thread, NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   423
-		close(ctxt->pam_psock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   424
-		close(ctxt->pam_csock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   425
-		memset(ctxt, 0, sizeof(*ctxt));
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   426
-		cleanup_ctxt = NULL;
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   427
+	if (ctxt != NULL && ctxt->pam_child != 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   428
+		signal(SIGCHLD, sshpam_oldsig);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   429
+		/* callback child should have had exited by now */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   430
+		kill(ctxt->pam_child, SIGTERM);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   431
+		if (ctxt->pam_psock != -1)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   432
+			close(ctxt->pam_psock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   433
+		if (ctxt->pam_csock != -1)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   434
+			close(ctxt->pam_csock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   435
+		if (sshpam_child_status == -1)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   436
+			waitpid(ctxt->pam_child, &sshpam_child_status, 0);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   437
+ 		cleanup_ctxt = NULL;
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   438
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   439
 }
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   440
 
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   441
@@ -681,7 +575,6 @@ derive_pam_service_name(Authctxt *authct
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   442
 static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   443
 sshpam_init(Authctxt *authctxt)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   444
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   445
-	extern char *__progname;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   446
 	const char *pam_rhost, *pam_user, *user = authctxt->user;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   447
 	const char **ptr_pam_user = &pam_user;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   448
 	struct ssh *ssh = active_state; /* XXX */
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   449
@@ -788,6 +681,7 @@ sshpam_init_ctx(Authctxt *authctxt)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   450
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   451
 	struct pam_ctxt *ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   452
 	int socks[2];
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   453
+	pid_t pid;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   454
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   455
 	debug3("PAM: %s entering", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   456
 	/*
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   457
@@ -805,7 +699,7 @@ sshpam_init_ctx(Authctxt *authctxt)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   458
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   459
 	ctxt = xcalloc(1, sizeof *ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   460
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   461
-	/* Start the authentication thread */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   462
+	/* Fork the callback child and start PAM authentication */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   463
 	if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, socks) == -1) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   464
 		error("PAM: failed create sockets: %s", strerror(errno));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   465
 		free(ctxt);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   466
@@ -813,15 +707,29 @@ sshpam_init_ctx(Authctxt *authctxt)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   467
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   468
 	ctxt->pam_psock = socks[0];
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   469
 	ctxt->pam_csock = socks[1];
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   470
-	if (pthread_create(&ctxt->pam_thread, NULL, sshpam_thread, ctxt) == -1) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   471
-		error("PAM: failed to start authentication thread: %s",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   472
-		    strerror(errno));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   473
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   474
+	sshpam_child_status = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   475
+	switch ((pid = fork())) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   476
+	case -1:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   477
+		error("fork(): %s", strerror(errno));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   478
 		close(socks[0]);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   479
 		close(socks[1]);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   480
 		free(ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   481
 		return (NULL);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   482
+	case 0:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   483
+		/* child processes query & respond for kbdint */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   484
+		close(ctxt->pam_csock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   485
+		ctxt->pam_csock = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   486
+		break;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   487
+	default:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   488
+		/* parent does PAM */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   489
+		ctxt->pam_child = pid;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   490
+		close(ctxt->pam_psock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   491
+		ctxt->pam_psock = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   492
+		sshpam_oldsig = signal(SIGCHLD, sshpam_sigchld_handler);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   493
+		cleanup_ctxt = ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   494
+		do_pam_auth(ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   495
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   496
-	cleanup_ctxt = ctxt;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   497
 	return (ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   498
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   499
 
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   500
@@ -836,8 +744,10 @@ sshpam_query(void *ctx, char **name, cha
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   501
 	u_char type;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   502
 	char *msg;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   503
 	size_t len, mlen;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   504
+	int r;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   505
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   506
 	debug3("PAM: %s entering", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   507
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   508
 	buffer_init(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   509
 	*name = xstrdup("");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   510
 	*info = xstrdup("");
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   511
@@ -845,6 +755,17 @@ sshpam_query(void *ctx, char **name, cha
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   512
 	**prompts = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   513
 	plen = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   514
 	*echo_on = xmalloc(sizeof(u_int));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   515
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   516
+	/* in case PAM was already done in callback child */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   517
+	switch (ctxt->pam_done) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   518
+	case 1:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   519
+		return (0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   520
+	case 0:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   521
+		break;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   522
+	default:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   523
+		return (-1);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   524
+	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   525
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   526
 	while (ssh_msg_recv(ctxt->pam_psock, &buffer) == 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   527
 		type = buffer_get_char(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   528
 		msg = buffer_get_string(&buffer, NULL);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   529
@@ -880,15 +801,6 @@ sshpam_query(void *ctx, char **name, cha
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   530
 			/* FALLTHROUGH */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   531
 		case PAM_AUTH_ERR:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   532
 			debug3("PAM: %s", pam_strerror(sshpam_handle, type));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   533
-			if (**prompts != NULL && strlen(**prompts) != 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   534
-				*info = **prompts;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   535
-				**prompts = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   536
-				*num = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   537
-				**echo_on = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   538
-				ctxt->pam_done = -1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   539
-				free(msg);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   540
-				return 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   541
-			}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   542
 			/* FALLTHROUGH */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   543
 		case PAM_SUCCESS:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   544
 			if (**prompts != NULL) {
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   545
@@ -899,25 +811,20 @@ sshpam_query(void *ctx, char **name, cha
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   546
 				free(**prompts);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   547
 				**prompts = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   548
 			}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   549
-			if (type == PAM_SUCCESS) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   550
-				if (!sshpam_authctxt->valid ||
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   551
-				    (sshpam_authctxt->pw->pw_uid == 0 &&
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   552
-				    options.permit_root_login != PERMIT_YES))
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   553
-					fatal("Internal error: PAM auth "
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   554
-					    "succeeded when it should have "
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   555
-					    "failed");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   556
-				import_environments(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   557
-				*num = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   558
-				**echo_on = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   559
-				ctxt->pam_done = 1;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   560
-				free(msg);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   561
-				return (0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   562
+			/* send accumulated messages to parent */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   563
+			buffer_clear(&buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   564
+			buffer_put_cstring(&buffer, buffer_ptr(&loginmsg));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   565
+			if (!use_privsep) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   566
+				/* sync packet state with parrent */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   567
+				r = ssh_packet_get_state(ssh, &buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   568
+				if (r != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   569
+					fatal("%s: get_state failed: %s",
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   570
+					    __func__, ssh_err(r));
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   571
 			}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   572
-			error("PAM: %s for %s%.100s from %.100s", msg,
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   573
-			    sshpam_authctxt->valid ? "" : "illegal user ",
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   574
-			    sshpam_authctxt->user,
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   575
-			    auth_get_canonical_hostname(ssh, options.use_dns));
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   576
-			/* FALLTHROUGH */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   577
+			ssh_msg_send(ctxt->pam_psock, type, &buffer);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   578
+			/* callback child ends here */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   579
+			close(ctxt->pam_psock);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   580
+			exit(0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   581
 		default:
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   582
 			*num = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   583
 			**echo_on = 0;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   584
@@ -997,7 +904,7 @@ sshpam_free_ctx(void *ctxtp)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   585
 	struct pam_ctxt *ctxt = ctxtp;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   586
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   587
 	debug3("PAM: %s entering", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   588
-	sshpam_thread_cleanup();
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   589
+	sshpam_child_cleanup();
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   590
 	free(ctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   591
 	/*
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   592
 	 * We don't call sshpam_cleanup() here because we may need the PAM
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   593
diff -pur old/auth-pam.h new/auth-pam.h
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   594
--- old/auth-pam.h
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   595
+++ new/auth-pam.h
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   596
@@ -45,7 +45,8 @@ int do_pam_putenv(char *, char *);
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   597
 char ** fetch_pam_environment(void);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   598
 char ** fetch_pam_child_environment(void);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   599
 void free_pam_environment(char **);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   600
-void sshpam_thread_cleanup(void);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   601
+void sshpam_child_cleanup(void);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   602
+int get_pam_done(void *);
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   603
 void sshpam_cleanup(void);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   604
 int sshpam_auth_passwd(Authctxt *, const char *);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   605
 int sshpam_get_maxtries_reached(void);
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   606
diff -pur old/monitor.c new/monitor.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   607
--- old/monitor.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   608
+++ new/monitor.c
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   609
@@ -1184,12 +1184,39 @@ mm_answer_pam_init_ctx(int sock, Buffer
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   610
 	sshpam_ctxt = (sshpam_device.init_ctx)(authctxt);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   611
 	sshpam_authok = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   612
 	buffer_clear(m);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   613
+	int pam_done = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   614
 	if (sshpam_ctxt != NULL) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   615
 		monitor_permit(mon_dispatch, MONITOR_REQ_PAM_FREE_CTX, 1);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   616
 		buffer_put_int(m, 1);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   617
 	} else {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   618
 		buffer_put_int(m, 0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   619
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   620
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   621
+	/* pam conversation successfully finished in child process */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   622
+	if (sshpam_ctxt != NULL && 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   623
+	    (pam_done = get_pam_done(sshpam_ctxt)) != 0) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   624
+		auth_method = "keyboard-interactive";
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   625
+		auth_submethod = "pam";
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   626
+		/* 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   627
+		 * ANS_PAM_INIT_CTX already sent by callback child.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   628
+		 * Privsep child now expects ANS_PAM_QUERY.
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   629
+		 */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   630
+		buffer_clear(m);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   631
+		buffer_put_int(m, 0);		/* ret */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   632
+		buffer_put_cstring(m, "");	/* name */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   633
+		if (pam_done == 1) {		/* info */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   634
+			buffer_put_cstring(m, "");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   635
+		} else {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   636
+			buffer_put_string(m, buffer_ptr(&loginmsg),
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   637
+			    buffer_len(&loginmsg));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   638
+			buffer_clear(&loginmsg);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   639
+		}
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   640
+		buffer_put_int(m, sshpam_get_maxtries_reached());
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   641
+		buffer_put_int(m, 0);		/* num */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   642
+		mm_request_send(sock, MONITOR_ANS_PAM_QUERY, m);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   643
+		return (0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   644
+	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   645
+
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   646
 	mm_request_send(sock, MONITOR_ANS_PAM_INIT_CTX, m);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   647
 	return (0);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   648
 }
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   649
@@ -1947,7 +1974,8 @@ monitor_apply_keystate(struct monitor *p
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   650
 	int r;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   651
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   652
 	debug3("%s: packet_set_state", __func__);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   653
-	if ((r = ssh_packet_set_state(ssh, child_state)) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   654
+	if ((r = ssh_packet_set_state(ssh, child_state)) != 0 ||
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   655
+	    (r = ssh_packet_set_postauth(ssh)) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   656
                 fatal("%s: packet_set_state: %s", __func__, ssh_err(r));
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   657
 	sshbuf_free(child_state);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   658
 	child_state = NULL;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   659
diff -pur old/packet.c new/packet.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   660
--- old/packet.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   661
+++ new/packet.c
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   662
@@ -2449,7 +2449,7 @@ ssh_packet_get_output(struct ssh *ssh)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   663
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   664
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   665
 /* Reset after_authentication and reset compression in post-auth privsep */
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   666
-static int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   667
+int
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   668
 ssh_packet_set_postauth(struct ssh *ssh)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   669
 {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   670
 	struct sshcomp *comp;
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   671
@@ -2775,8 +2775,7 @@ ssh_packet_set_state(struct ssh *ssh, st
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   672
 	cipher_set_keycontext(&state->send_context, keyout);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   673
 	cipher_set_keycontext(&state->receive_context, keyin);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   674
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   675
-	if ((r = ssh_packet_set_compress_state(ssh, m)) != 0 ||
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   676
-	    (r = ssh_packet_set_postauth(ssh)) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   677
+	if ((r = ssh_packet_set_compress_state(ssh, m)) != 0)
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   678
 		return r;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   679
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   680
 	sshbuf_reset(state->input);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   681
diff -pur old/packet.h new/packet.h
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   682
--- old/packet.h
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   683
+++ new/packet.h
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   684
@@ -144,6 +144,7 @@ u_int	 ssh_packet_get_maxsize(struct ssh
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   685
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   686
 int	 ssh_packet_get_state(struct ssh *, struct sshbuf *);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   687
 int	 ssh_packet_set_state(struct ssh *, struct sshbuf *);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   688
+int	 ssh_packet_set_postauth(struct ssh *ssh);
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   689
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   690
 const char *ssh_remote_ipaddr(struct ssh *);
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   691
 int	 ssh_remote_port(struct ssh *);
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   692
diff -pur old/servconf.c new/servconf.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   693
--- old/servconf.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   694
+++ new/servconf.c
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   695
@@ -435,6 +435,18 @@ fill_default_server_options(ServerOption
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   696
 		options->compression = 0;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   697
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   698
 #endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   699
+#ifdef USE_PAM
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   700
+	if (!use_privsep && options->compression == COMP_ZLIB && 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   701
+	    options->use_pam && 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   702
+	    (options->kbd_interactive_authentication || 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   703
+	     options->challenge_response_authentication)) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   704
+		error("Compression algorithm 'zlib' is not supported for "
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   705
+		    "PAM authentication when privilege separation is off");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   706
+		error("Limmiting compression algorithms to "
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   707
+		    "'none,[email protected]'");
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   708
+		options->compression = COMP_DELAYED;
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   709
+	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   710
+#endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   711
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   712
 }
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   713
 
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   714
diff -pur old/session.c new/session.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   715
--- old/session.c
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   716
+++ new/session.c
7320
edeb951aa980 24525860 upgrade OpenSSH to 7.3p1
Jan Parcel <jan.parcel@oracle.com>
parents: 6077
diff changeset
   717
@@ -2890,7 +2890,7 @@ do_cleanup(Authctxt *authctxt)
6077
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   718
 #ifdef USE_PAM
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   719
 	if (options.use_pam) {
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   720
 		sshpam_cleanup();
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   721
-		sshpam_thread_cleanup();
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   722
+		sshpam_child_cleanup();
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   723
 	}
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   724
 #endif
db9eab3e96fe 21937600 pam_set_data doesn't work in OpenSSH PAM implementation
Zdenek Kotala <Zdenek.Kotala@oracle.com>
parents:
diff changeset
   725