1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-01-10 09:58:01 +00:00

do_ssh1_login: remove user input parameters.

This is the first refactoring of a major coroutine enabled by adding
the ssh->user_input queue. Now, instead of receiving a fixed block of
parameter data, do_ssh1_login reads directly from the user input
bufchain.

In particular, I can get rid of all the temporary bufchains I
constructed to pass to get_userpass_input (or rather, the ones in this
particular function), because now we can let get_userpass_input read
directly from the main user_input bufchain, and it will read only as
much data as it has an interest in, and leave the rest as type-ahead
for future prompts or the main session.
This commit is contained in:
Simon Tatham 2018-05-18 07:22:58 +01:00
parent c3abc30405
commit 265365ab80

52
ssh.c
View File

@ -384,8 +384,7 @@ static void ssh2_pkt_addmp(struct Packet *, Bignum b);
static int ssh2_pkt_construct(Ssh, struct Packet *);
static void ssh2_pkt_send(Ssh, struct Packet *);
static void ssh2_pkt_send_noqueue(Ssh, struct Packet *);
static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
struct Packet *pktin);
static int do_ssh1_login(Ssh ssh, struct Packet *pktin);
static void do_ssh2_authconn(Ssh ssh, const unsigned char *in, int inlen,
struct Packet *pktin);
static void ssh_channel_init(struct ssh_channel *c);
@ -3953,7 +3952,7 @@ static void ssh_agent_callback(void *sshv, void *reply, int replylen)
ssh->agent_response_len = replylen;
if (ssh->version == 1)
do_ssh1_login(ssh, NULL, -1, NULL);
do_ssh1_login(ssh, NULL);
else
do_ssh2_authconn(ssh, NULL, -1, NULL);
}
@ -3965,7 +3964,7 @@ static void ssh_dialog_callback(void *sshv, int ret)
ssh->user_response = ret;
if (ssh->version == 1)
do_ssh1_login(ssh, NULL, -1, NULL);
do_ssh1_login(ssh, NULL);
else
do_ssh2_transport(ssh, NULL, -1, NULL);
@ -4199,8 +4198,7 @@ int verify_ssh_manual_host_key(Ssh ssh, const char *fingerprint,
/*
* Handle the key exchange and user authentication phases.
*/
static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
struct Packet *pktin)
static int do_ssh1_login(Ssh ssh, struct Packet *pktin)
{
int i, j, ret;
unsigned char *ptr;
@ -4338,6 +4336,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
s->dlgret = 1;
#endif
if (s->dlgret < 0) {
ssh->user_response = -1;
do {
crReturn(0);
if (pktin) {
@ -4345,7 +4344,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
" for user host key response"));
crStop(0);
}
} while (pktin || inlen > 0);
} while (ssh->user_response < 0);
s->dlgret = ssh->user_response;
}
ssh_set_frozen(ssh, 0);
@ -4424,6 +4423,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
s->dlgret = askalg(ssh->frontend, "cipher", cipher_string,
ssh_dialog_callback, ssh);
if (s->dlgret < 0) {
ssh->user_response = -1;
do {
crReturn(0);
if (pktin) {
@ -4431,7 +4431,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
" for user response"));
crStop(0);
}
} while (pktin || inlen > 0);
} while (ssh->user_response < 0);
s->dlgret = ssh->user_response;
}
ssh_set_frozen(ssh, 0);
@ -4511,13 +4511,9 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
add_prompt(s->cur_prompt, dupstr("login as: "), TRUE);
ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) {
bufchain tmp_user_input;
ssh->send_ok = 1;
crWaitUntil(!pktin);
bufchain_init(&tmp_user_input);
bufchain_add(&tmp_user_input, in, inlen);
ret = get_userpass_input(s->cur_prompt, &tmp_user_input);
bufchain_clear(&tmp_user_input);
ret = get_userpass_input(s->cur_prompt, &ssh->user_input);
ssh->send_ok = 0;
}
if (!ret) {
@ -4619,6 +4615,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
ssh->auth_agent_query = agent_query(
s->request, 5, &r, &s->responselen, ssh_agent_callback, ssh);
if (ssh->auth_agent_query) {
ssh->agent_response = NULL;
do {
crReturn(0);
if (pktin) {
@ -4626,7 +4623,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
" for agent response"));
crStop(0);
}
} while (pktin || inlen > 0);
} while (!ssh->agent_response);
r = ssh->agent_response;
s->responselen = ssh->agent_response_len;
}
@ -4728,6 +4725,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
ssh_agent_callback, ssh);
if (ssh->auth_agent_query) {
sfree(agentreq);
ssh->agent_response = NULL;
do {
crReturn(0);
if (pktin) {
@ -4736,7 +4734,7 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
" response"));
crStop(0);
}
} while (pktin || inlen > 0);
} while (!ssh->agent_response);
vret = ssh->agent_response;
retlen = ssh->agent_response_len;
} else
@ -4822,14 +4820,10 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
s->publickey_comment), FALSE);
ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) {
bufchain tmp_user_input;
ssh->send_ok = 1;
crWaitUntil(!pktin);
bufchain_init(&tmp_user_input);
bufchain_add(&tmp_user_input, in, inlen);
ret = get_userpass_input(s->cur_prompt,
&tmp_user_input);
bufchain_clear(&tmp_user_input);
ret = get_userpass_input(s->cur_prompt,
&ssh->user_input);
ssh->send_ok = 0;
}
if (!ret) {
@ -5047,13 +5041,9 @@ static int do_ssh1_login(Ssh ssh, const unsigned char *in, int inlen,
int ret; /* need not be kept over crReturn */
ret = get_userpass_input(s->cur_prompt, NULL);
while (ret < 0) {
bufchain tmp_user_input;
ssh->send_ok = 1;
crWaitUntil(!pktin);
bufchain_init(&tmp_user_input);
bufchain_add(&tmp_user_input, in, inlen);
ret = get_userpass_input(s->cur_prompt, &tmp_user_input);
bufchain_clear(&tmp_user_input);
ret = get_userpass_input(s->cur_prompt, &ssh->user_input);
ssh->send_ok = 0;
}
if (!ret) {
@ -6275,13 +6265,7 @@ static void ssh_msg_ignore(Ssh ssh, struct Packet *pktin)
static void ssh1_login_input(Ssh ssh)
{
while (bufchain_size(&ssh->user_input) > 0) {
void *data;
int len;
bufchain_prefix(&ssh->user_input, &data, &len);
do_ssh1_login(ssh, data, len, NULL);
bufchain_consume(&ssh->user_input, len);
}
do_ssh1_login(ssh, NULL);
}
static void ssh1_connection_input(Ssh ssh)
@ -6299,7 +6283,7 @@ static void ssh1_coro_wrapper_session(Ssh ssh, struct Packet *pktin);
static void ssh1_coro_wrapper_initial(Ssh ssh, struct Packet *pktin)
{
if (do_ssh1_login(ssh, NULL, 0, pktin)) {
if (do_ssh1_login(ssh, pktin)) {
int i;
for (i = 0; i < 256; i++)
if (ssh->packet_dispatch[i] == ssh1_coro_wrapper_initial)