- (djm) Bug #632: Don't call pam_end indirectly from within kbd-int
   conversation function
diff --git a/auth-pam.c b/auth-pam.c
index 1f0b791..4d2f9c5 100644
--- a/auth-pam.c
+++ b/auth-pam.c
@@ -31,7 +31,7 @@
 
 /* Based on $FreeBSD: src/crypto/openssh/auth2-pam-freebsd.c,v 1.11 2003/03/31 13:48:18 des Exp $ */
 #include "includes.h"
-RCSID("$Id: auth-pam.c,v 1.78 2003/11/13 08:52:31 dtucker Exp $");
+RCSID("$Id: auth-pam.c,v 1.79 2003/11/17 10:27:55 djm Exp $");
 
 #ifdef USE_PAM
 #include <security/pam_appl.h>
@@ -156,9 +156,11 @@
 		case PAM_PROMPT_ECHO_OFF:
 			buffer_put_cstring(&buffer, 
 			    PAM_MSG_MEMBER(msg, i, msg));
-			ssh_msg_send(ctxt->pam_csock, 
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer);
-			ssh_msg_recv(ctxt->pam_csock, &buffer);
+			if (ssh_msg_send(ctxt->pam_csock, 
+			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+				goto fail;
+			if (ssh_msg_recv(ctxt->pam_csock, &buffer) == -1) 
+				goto fail;
 			if (buffer_get_char(&buffer) != PAM_AUTHTOK)
 				goto fail;
 			reply[i].resp = buffer_get_string(&buffer, NULL);
@@ -166,9 +168,11 @@
 		case PAM_PROMPT_ECHO_ON:
 			buffer_put_cstring(&buffer, 
 			    PAM_MSG_MEMBER(msg, i, msg));
-			ssh_msg_send(ctxt->pam_csock, 
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer);
-			ssh_msg_recv(ctxt->pam_csock, &buffer);
+			if (ssh_msg_send(ctxt->pam_csock, 
+			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+				goto fail;
+			if (ssh_msg_recv(ctxt->pam_csock, &buffer) == -1)
+				goto fail;
 			if (buffer_get_char(&buffer) != PAM_AUTHTOK)
 				goto fail;
 			reply[i].resp = buffer_get_string(&buffer, NULL);
@@ -176,14 +180,16 @@
 		case PAM_ERROR_MSG:
 			buffer_put_cstring(&buffer, 
 			    PAM_MSG_MEMBER(msg, i, msg));
-			ssh_msg_send(ctxt->pam_csock, 
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer);
+			if (ssh_msg_send(ctxt->pam_csock, 
+			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+				goto fail;
 			break;
 		case PAM_TEXT_INFO:
 			buffer_put_cstring(&buffer, 
 			    PAM_MSG_MEMBER(msg, i, msg));
-			ssh_msg_send(ctxt->pam_csock, 
-			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer);
+			if (ssh_msg_send(ctxt->pam_csock, 
+			    PAM_MSG_MEMBER(msg, i, msg_style), &buffer) == -1)
+				goto fail;
 			break;
 		default:
 			goto fail;
@@ -232,6 +238,7 @@
 	if (sshpam_err != PAM_SUCCESS)
 		goto auth_fail;
 	buffer_put_cstring(&buffer, "OK");
+	/* XXX - can't do much about an error here */
 	ssh_msg_send(ctxt->pam_csock, sshpam_err, &buffer);
 	buffer_free(&buffer);
 	pthread_exit(NULL);
@@ -239,6 +246,7 @@
  auth_fail:
 	buffer_put_cstring(&buffer,
 	    pam_strerror(sshpam_handle, sshpam_err));
+	/* XXX - can't do much about an error here */
 	ssh_msg_send(ctxt->pam_csock, PAM_AUTH_ERR, &buffer);
 	buffer_free(&buffer);
 	pthread_exit(NULL);
@@ -474,7 +482,10 @@
 	}
 	buffer_init(&buffer);
 	buffer_put_cstring(&buffer, *resp);
-	ssh_msg_send(ctxt->pam_psock, PAM_AUTHTOK, &buffer);
+	if (ssh_msg_send(ctxt->pam_psock, PAM_AUTHTOK, &buffer) == -1) {
+		buffer_free(&buffer);
+		return (-1);
+	}
 	buffer_free(&buffer);
 	return (1);
 }