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

Stop passing incoming packets through ssh->protocol.

After the previous two refactorings, there's no longer any need to
pass packets to ssh1_protocol or ssh2_protocol so that each one can do
its own thing with them, because now the handling is the same in both
cases: first call the general type-independent packet processing code
(if any), and then call the dispatch table entry for the packet type
(which now always exists).
This commit is contained in:
Simon Tatham 2018-05-18 07:22:57 +01:00
parent 0a15a2c471
commit 5d9adc5c93

52
ssh.c
View File

@ -725,12 +725,9 @@ struct Packet {
const char *additional_log_text; const char *additional_log_text;
}; };
static void ssh1_protocol(Ssh ssh, const void *vin, int inlen, static void ssh1_protocol(Ssh ssh, const void *vin, int inlen);
struct Packet *pktin); static void ssh2_protocol(Ssh ssh, const void *vin, int inlen);
static void ssh2_protocol(Ssh ssh, const void *vin, int inlen, static void ssh2_bare_connection_protocol(Ssh ssh, const void *vin, int inlen);
struct Packet *pktin);
static void ssh2_bare_connection_protocol(Ssh ssh, const void *vin, int inlen,
struct Packet *pktin);
static void ssh1_protocol_setup(Ssh ssh); static void ssh1_protocol_setup(Ssh ssh);
static void ssh2_protocol_setup(Ssh ssh); static void ssh2_protocol_setup(Ssh ssh);
static void ssh2_bare_connection_protocol_setup(Ssh ssh); static void ssh2_bare_connection_protocol_setup(Ssh ssh);
@ -979,8 +976,8 @@ struct ssh_tag {
/* SSH-1 and SSH-2 use this for different things, but both use it */ /* SSH-1 and SSH-2 use this for different things, but both use it */
int protocol_initial_phase_done; int protocol_initial_phase_done;
void (*protocol) (Ssh ssh, const void *vin, int inlen, void (*protocol) (Ssh ssh, const void *vin, int inlen);
struct Packet *pkt); void (*general_packet_processing)(Ssh ssh, struct Packet *pkt);
void (*current_incoming_data_fn) (Ssh ssh); void (*current_incoming_data_fn) (Ssh ssh);
/* /*
@ -3350,6 +3347,7 @@ static void do_ssh_init(Ssh ssh)
*/ */
ssh->protocol = ssh2_protocol; ssh->protocol = ssh2_protocol;
ssh2_protocol_setup(ssh); ssh2_protocol_setup(ssh);
ssh->general_packet_processing = ssh2_general_packet_processing;
ssh->current_incoming_data_fn = ssh2_rdpkt; ssh->current_incoming_data_fn = ssh2_rdpkt;
} else { } else {
/* /*
@ -3574,7 +3572,9 @@ static void ssh_process_pq_full(void *ctx)
struct Packet *pktin; struct Packet *pktin;
while ((pktin = pq_pop(&ssh->pq_full)) != NULL) { while ((pktin = pq_pop(&ssh->pq_full)) != NULL) {
ssh->protocol(ssh, NULL, 0, pktin); if (ssh->general_packet_processing)
ssh->general_packet_processing(ssh, pktin);
ssh->packet_dispatch[pktin->type](ssh, pktin);
ssh_unref_packet(pktin); ssh_unref_packet(pktin);
} }
} }
@ -6296,26 +6296,20 @@ static void ssh1_protocol_setup(Ssh ssh)
ssh->packet_dispatch[SSH1_MSG_DEBUG] = ssh1_msg_debug; ssh->packet_dispatch[SSH1_MSG_DEBUG] = ssh1_msg_debug;
} }
static void ssh1_protocol(Ssh ssh, const void *vin, int inlen, static void ssh1_protocol(Ssh ssh, const void *vin, int inlen)
struct Packet *pktin)
{ {
const unsigned char *in = (const unsigned char *)vin; const unsigned char *in = (const unsigned char *)vin;
if (ssh->state == SSH_STATE_CLOSED) if (ssh->state == SSH_STATE_CLOSED)
return; return;
if (pktin) {
ssh->packet_dispatch[pktin->type](ssh, pktin);
return;
}
if (!ssh->protocol_initial_phase_done) { if (!ssh->protocol_initial_phase_done) {
if (do_ssh1_login(ssh, in, inlen, pktin)) if (do_ssh1_login(ssh, in, inlen, NULL))
ssh->protocol_initial_phase_done = TRUE; ssh->protocol_initial_phase_done = TRUE;
else else
return; return;
} }
do_ssh1_connection(ssh, in, inlen, pktin); do_ssh1_connection(ssh, in, inlen, NULL);
} }
/* /*
@ -12241,34 +12235,25 @@ static void ssh2_general_packet_processing(Ssh ssh, struct Packet *pktin)
do_ssh2_transport(ssh, "too much data received", -1, NULL); do_ssh2_transport(ssh, "too much data received", -1, NULL);
} }
static void ssh2_protocol(Ssh ssh, const void *vin, int inlen, static void ssh2_protocol(Ssh ssh, const void *vin, int inlen)
struct Packet *pktin)
{ {
const unsigned char *in = (const unsigned char *)vin; const unsigned char *in = (const unsigned char *)vin;
if (ssh->state == SSH_STATE_CLOSED) if (ssh->state == SSH_STATE_CLOSED)
return; return;
ssh2_general_packet_processing(ssh, pktin); if (!ssh->protocol_initial_phase_done)
do_ssh2_transport(ssh, in, inlen, NULL);
if (pktin)
ssh->packet_dispatch[pktin->type](ssh, pktin);
else if (!ssh->protocol_initial_phase_done)
do_ssh2_transport(ssh, in, inlen, pktin);
else else
do_ssh2_authconn(ssh, in, inlen, pktin); do_ssh2_authconn(ssh, in, inlen, NULL);
} }
static void ssh2_bare_connection_protocol(Ssh ssh, const void *vin, int inlen, static void ssh2_bare_connection_protocol(Ssh ssh, const void *vin, int inlen)
struct Packet *pktin)
{ {
const unsigned char *in = (const unsigned char *)vin; const unsigned char *in = (const unsigned char *)vin;
if (ssh->state == SSH_STATE_CLOSED) if (ssh->state == SSH_STATE_CLOSED)
return; return;
if (pktin) do_ssh2_authconn(ssh, in, inlen, NULL);
ssh->packet_dispatch[pktin->type](ssh, pktin);
else
do_ssh2_authconn(ssh, in, inlen, pktin);
} }
static void ssh_cache_conf_values(Ssh ssh) static void ssh_cache_conf_values(Ssh ssh)
@ -12406,6 +12391,7 @@ static const char *ssh_init(void *frontend_handle, void **backend_handle,
ssh->fallback_cmd = 0; ssh->fallback_cmd = 0;
ssh->protocol = NULL; ssh->protocol = NULL;
ssh->general_packet_processing = NULL;
ssh->protocol_initial_phase_done = FALSE; ssh->protocol_initial_phase_done = FALSE;