summaryrefslogtreecommitdiff
path: root/auth-pam.c
diff options
context:
space:
mode:
authordjm <djm>2003-11-17 10:27:55 +0000
committerdjm <djm>2003-11-17 10:27:55 +0000
commit74453db24fd8722e86278179f9cf59d5612f36a5 (patch)
tree81d0113681b4f524b0543eee15493463f115174e /auth-pam.c
parent2bcceb624509de7adce85e56b8531953f7b64ac2 (diff)
downloadopenssh-74453db24fd8722e86278179f9cf59d5612f36a5.tar.gz
- (djm) Bug #632: Don't call pam_end indirectly from within kbd-int
conversation function
Diffstat (limited to 'auth-pam.c')
-rw-r--r--auth-pam.c35
1 files changed, 23 insertions, 12 deletions
diff --git a/auth-pam.c b/auth-pam.c
index 1f0b791e..4d2f9c59 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 @@ sshpam_thread_conv(int n, const struct pam_message **msg,
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 @@ sshpam_thread_conv(int n, const struct pam_message **msg,
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 @@ sshpam_thread_conv(int n, const struct pam_message **msg,
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 @@ sshpam_thread(void *ctxtp)
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 @@ sshpam_thread(void *ctxtp)
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 @@ sshpam_respond(void *ctx, u_int num, char **resp)
}
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);
}