1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-03-22 06:38:37 -05:00

Remove body and length fields from PktIn.

They were duplicating values stored in the BinarySource substructure.
Mostly they're not referred to directly any more (instead, we call
get_foo to access the BinarySource); and when they are, we can switch
to reading the same values back out of the BinarySource anyway.
This commit is contained in:
Simon Tatham 2018-06-06 07:17:09 +01:00
parent ce6c65aba1
commit bf3c9df54a

93
ssh.c
View File

@ -672,11 +672,9 @@ struct ssh_portfwd {
struct PktIn { struct PktIn {
int refcount; int refcount;
long length; /* length relative to 'body' */
int type; int type;
unsigned long sequence; /* SSH-2 incoming sequence number */ unsigned long sequence; /* SSH-2 incoming sequence number */
unsigned char *data; /* allocated storage */ unsigned char *data; /* allocated storage */
unsigned char *body; /* offset of payload within `data' */
long maxlen; /* amount of storage allocated for `data' */ long maxlen; /* amount of storage allocated for `data' */
long encrypted_len; /* for SSH-2 total-size counting */ long encrypted_len; /* for SSH-2 total-size counting */
BinarySource_IMPLEMENTATION; BinarySource_IMPLEMENTATION;
@ -809,14 +807,14 @@ static int pq_empty_on_to_front_of(struct PacketQueue *src,
} }
struct rdpkt1_state_tag { struct rdpkt1_state_tag {
long len, pad, biglen; long len, pad, biglen, length;
unsigned long realcrc, gotcrc; unsigned long realcrc, gotcrc;
int chunk; int chunk;
PktIn *pktin; PktIn *pktin;
}; };
struct rdpkt2_state_tag { struct rdpkt2_state_tag {
long len, pad, payload, packetlen, maclen; long len, pad, payload, packetlen, maclen, length;
int cipherblk; int cipherblk;
unsigned long incoming_sequence; unsigned long incoming_sequence;
PktIn *pktin; PktIn *pktin;
@ -1407,7 +1405,8 @@ static void ssh1_log_incoming_packet(Ssh ssh, const PktIn *pkt)
ptrlen str; ptrlen str;
BinarySource src[1]; BinarySource src[1];
BinarySource_BARE_INIT(src, pkt->body, pkt->length); BinarySource_BARE_INIT(src, BinarySource_UPCAST(pkt)->data,
BinarySource_UPCAST(pkt)->len);
if (ssh->logomitdata && if (ssh->logomitdata &&
(pkt->type == SSH1_SMSG_STDOUT_DATA || (pkt->type == SSH1_SMSG_STDOUT_DATA ||
@ -1424,10 +1423,8 @@ static void ssh1_log_incoming_packet(Ssh ssh, const PktIn *pkt)
nblanks++; nblanks++;
} }
} }
log_packet(ssh->logctx, PKT_INCOMING, pkt->type, log_packet(ssh->logctx, PKT_INCOMING, pkt->type, ssh1_pkt_type(pkt->type),
ssh1_pkt_type(pkt->type), src->data, src->len, nblanks, blanks, NULL, 0, NULL);
pkt->body, pkt->length, nblanks, blanks, NULL,
0, NULL);
} }
static void ssh1_log_outgoing_packet(Ssh ssh, const PktOut *pkt) static void ssh1_log_outgoing_packet(Ssh ssh, const PktOut *pkt)
@ -1511,12 +1508,12 @@ static void ssh1_rdpkt(Ssh ssh)
while (1) { while (1) {
st->pktin = snew(PktIn); st->pktin = snew(PktIn);
st->pktin->body = st->pktin->data = NULL; st->pktin->data = NULL;
st->pktin->maxlen = 0; st->pktin->maxlen = 0;
st->pktin->refcount = 1; st->pktin->refcount = 1;
st->pktin->type = 0; st->pktin->type = 0;
st->pktin->length = 0; st->length = 0;
{ {
unsigned char lenbuf[4]; unsigned char lenbuf[4];
@ -1527,7 +1524,7 @@ static void ssh1_rdpkt(Ssh ssh)
st->pad = 8 - (st->len % 8); st->pad = 8 - (st->len % 8);
st->biglen = st->len + st->pad; st->biglen = st->len + st->pad;
st->pktin->length = st->len - 5; st->length = st->len - 5;
if (st->biglen < 0) { if (st->biglen < 0) {
bombout(("Extremely large packet length from server suggests" bombout(("Extremely large packet length from server suggests"
@ -1561,13 +1558,12 @@ static void ssh1_rdpkt(Ssh ssh)
crStopV; crStopV;
} }
st->pktin->body = st->pktin->data + st->pad + 1;
if (ssh->v1_compressing) { if (ssh->v1_compressing) {
unsigned char *decompblk; unsigned char *decompblk;
int decomplen; int decomplen;
if (!zlib_decompress_block(ssh->sc_comp_ctx, if (!zlib_decompress_block(ssh->sc_comp_ctx,
st->pktin->body - 1, st->pktin->length + 1, st->pktin->data + st->pad,
st->length + 1,
&decompblk, &decomplen)) { &decompblk, &decomplen)) {
bombout(("Zlib decompression encountered invalid data")); bombout(("Zlib decompression encountered invalid data"));
ssh_unref_packet(st->pktin); ssh_unref_packet(st->pktin);
@ -1578,26 +1574,25 @@ static void ssh1_rdpkt(Ssh ssh)
st->pktin->maxlen = st->pad + decomplen; st->pktin->maxlen = st->pad + decomplen;
st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen, st->pktin->data = sresize(st->pktin->data, st->pktin->maxlen,
unsigned char); unsigned char);
st->pktin->body = st->pktin->data + st->pad + 1;
} }
memcpy(st->pktin->body - 1, decompblk, decomplen); memcpy(st->pktin->data + st->pad, decompblk, decomplen);
sfree(decompblk); sfree(decompblk);
st->pktin->length = decomplen - 1; st->length = decomplen - 1;
} }
st->pktin->type = st->pktin->body[-1]; st->pktin->type = st->pktin->data[st->pad];
/* /*
* Now pktin->body and pktin->length identify the semantic content * Now we know the bounds of the semantic content of the
* of the packet, excluding the initial type byte. * packet, excluding the initial type byte.
*/ */
BinarySource_INIT(st->pktin, st->pktin->data + st->pad + 1,
st->length);
if (ssh->logctx) if (ssh->logctx)
ssh1_log_incoming_packet(ssh, st->pktin); ssh1_log_incoming_packet(ssh, st->pktin);
BinarySource_INIT(st->pktin, st->pktin->body, st->pktin->length);
/* /*
* Mild layer violation: if the message is a DISCONNECT, we * Mild layer violation: if the message is a DISCONNECT, we
* should unset the close_expected flag, because now we _do_ * should unset the close_expected flag, because now we _do_
@ -1625,7 +1620,8 @@ static void ssh2_log_incoming_packet(Ssh ssh, const PktIn *pkt)
ptrlen str; ptrlen str;
BinarySource src[1]; BinarySource src[1];
BinarySource_BARE_INIT(src, pkt->body, pkt->length); BinarySource_BARE_INIT(src, BinarySource_UPCAST(pkt)->data,
BinarySource_UPCAST(pkt)->len);
if (ssh->logomitdata && if (ssh->logomitdata &&
(pkt->type == SSH2_MSG_CHANNEL_DATA || (pkt->type == SSH2_MSG_CHANNEL_DATA ||
@ -1645,7 +1641,7 @@ static void ssh2_log_incoming_packet(Ssh ssh, const PktIn *pkt)
log_packet(ssh->logctx, PKT_INCOMING, pkt->type, log_packet(ssh->logctx, PKT_INCOMING, pkt->type,
ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pkt->type), ssh2_pkt_type(ssh->pkt_kctx, ssh->pkt_actx, pkt->type),
pkt->body, pkt->length, nblanks, blanks, &pkt->sequence, src->data, src->len, nblanks, blanks, &pkt->sequence,
0, NULL); 0, NULL);
} }
@ -1759,12 +1755,12 @@ static void ssh2_rdpkt(Ssh ssh)
while (1) { while (1) {
st->pktin = snew(PktIn); st->pktin = snew(PktIn);
st->pktin->body = st->pktin->data = NULL; st->pktin->data = NULL;
st->pktin->maxlen = 0; st->pktin->maxlen = 0;
st->pktin->refcount = 1; st->pktin->refcount = 1;
st->pktin->type = 0; st->pktin->type = 0;
st->pktin->length = 0; st->length = 0;
if (ssh->sccipher) if (ssh->sccipher)
st->cipherblk = ssh->sccipher->blksize; st->cipherblk = ssh->sccipher->blksize;
else else
@ -1984,13 +1980,13 @@ static void ssh2_rdpkt(Ssh ssh)
*/ */
st->payload = st->len - st->pad - 1; st->payload = st->len - st->pad - 1;
st->pktin->length = st->payload + 5; st->length = st->payload + 5;
st->pktin->encrypted_len = st->packetlen; st->pktin->encrypted_len = st->packetlen;
st->pktin->sequence = st->incoming_sequence++; st->pktin->sequence = st->incoming_sequence++;
st->pktin->length = st->packetlen - st->pad; st->length = st->packetlen - st->pad;
assert(st->pktin->length >= 0); assert(st->length >= 0);
/* /*
* Decompress packet payload. * Decompress packet payload.
@ -2000,7 +1996,7 @@ static void ssh2_rdpkt(Ssh ssh)
int newlen; int newlen;
if (ssh->sccomp && if (ssh->sccomp &&
ssh->sccomp->decompress(ssh->sc_comp_ctx, ssh->sccomp->decompress(ssh->sc_comp_ctx,
st->pktin->data + 5, st->pktin->length - 5, st->pktin->data + 5, st->length - 5,
&newpayload, &newlen)) { &newpayload, &newlen)) {
if (st->pktin->maxlen < newlen + 5) { if (st->pktin->maxlen < newlen + 5) {
st->pktin->maxlen = newlen + 5; st->pktin->maxlen = newlen + 5;
@ -2008,7 +2004,7 @@ static void ssh2_rdpkt(Ssh ssh)
st->pktin->maxlen, st->pktin->maxlen,
unsigned char); unsigned char);
} }
st->pktin->length = 5 + newlen; st->length = 5 + newlen;
memcpy(st->pktin->data + 5, newpayload, newlen); memcpy(st->pktin->data + 5, newpayload, newlen);
sfree(newpayload); sfree(newpayload);
} }
@ -2019,24 +2015,22 @@ static void ssh2_rdpkt(Ssh ssh)
* with no type byte are forbidden, so treat them as deserving * with no type byte are forbidden, so treat them as deserving
* an SSH_MSG_UNIMPLEMENTED. * an SSH_MSG_UNIMPLEMENTED.
*/ */
if (st->pktin->length <= 5) { /* == 5 we hope, but robustness */ if (st->length <= 5) { /* == 5 we hope, but robustness */
ssh2_msg_something_unimplemented(ssh, st->pktin); ssh2_msg_something_unimplemented(ssh, st->pktin);
crStopV; crStopV;
} }
/* /*
* pktin->body and pktin->length should identify the semantic * Now we can identify the semantic content of the packet,
* content of the packet, excluding the initial type byte. * and also the initial type byte.
*/ */
st->pktin->type = st->pktin->data[5]; st->pktin->type = st->pktin->data[5];
st->pktin->body = st->pktin->data + 6; st->length -= 6;
st->pktin->length -= 6; assert(st->length >= 0); /* one last double-check */
assert(st->pktin->length >= 0); /* one last double-check */ BinarySource_INIT(st->pktin, st->pktin->data + 6, st->length);
if (ssh->logctx) if (ssh->logctx)
ssh2_log_incoming_packet(ssh, st->pktin); ssh2_log_incoming_packet(ssh, st->pktin);
BinarySource_INIT(st->pktin, st->pktin->body, st->pktin->length);
/* /*
* Mild layer violation: if the message is a DISCONNECT, we * Mild layer violation: if the message is a DISCONNECT, we
* should unset the close_expected flag, because now we _do_ * should unset the close_expected flag, because now we _do_
@ -2086,7 +2080,6 @@ static void ssh2_bare_connection_rdpkt(Ssh ssh)
} }
st->pktin = snew(PktIn); st->pktin = snew(PktIn);
st->pktin->body = NULL;
st->pktin->maxlen = 0; st->pktin->maxlen = 0;
st->pktin->refcount = 1; st->pktin->refcount = 1;
st->pktin->data = snewn(st->packetlen, unsigned char); st->pktin->data = snewn(st->packetlen, unsigned char);
@ -2107,8 +2100,7 @@ static void ssh2_bare_connection_rdpkt(Ssh ssh)
* content of the packet, excluding the initial type byte. * content of the packet, excluding the initial type byte.
*/ */
st->pktin->type = st->pktin->data[0]; st->pktin->type = st->pktin->data[0];
st->pktin->body = st->pktin->data + 1; BinarySource_INIT(st->pktin, st->pktin->data + 1, st->packetlen - 1);
st->pktin->length = st->packetlen - 1;
/* /*
* Log incoming packet, possibly omitting sensitive fields. * Log incoming packet, possibly omitting sensitive fields.
@ -2116,8 +2108,6 @@ static void ssh2_bare_connection_rdpkt(Ssh ssh)
if (ssh->logctx) if (ssh->logctx)
ssh2_log_incoming_packet(ssh, st->pktin); ssh2_log_incoming_packet(ssh, st->pktin);
BinarySource_INIT(st->pktin, st->pktin->body, st->pktin->length);
/* /*
* Mild layer violation: if the message is a DISCONNECT, we * Mild layer violation: if the message is a DISCONNECT, we
* should unset the close_expected flag, because now we _do_ * should unset the close_expected flag, because now we _do_
@ -5270,7 +5260,8 @@ static void ssh_sharing_global_request_response(Ssh ssh, PktIn *pktin,
void *ctx) void *ctx)
{ {
share_got_pkt_from_server(ctx, pktin->type, share_got_pkt_from_server(ctx, pktin->type,
pktin->body, pktin->length); BinarySource_UPCAST(pktin)->data,
BinarySource_UPCAST(pktin)->len);
} }
void ssh_sharing_queue_global_request(Ssh ssh, void *share_ctx) void ssh_sharing_queue_global_request(Ssh ssh, void *share_ctx)
@ -7051,7 +7042,9 @@ static void do_ssh2_transport(void *vctx)
put_string(ssh->exhash_bs, s->our_kexinit, s->our_kexinitlen); put_string(ssh->exhash_bs, s->our_kexinit, s->our_kexinitlen);
sfree(s->our_kexinit); sfree(s->our_kexinit);
/* Include the type byte in the hash of server's KEXINIT */ /* Include the type byte in the hash of server's KEXINIT */
put_string(ssh->exhash_bs, pktin->body - 1, pktin->length + 1); put_string(ssh->exhash_bs,
(const char *)BinarySource_UPCAST(pktin)->data - 1,
BinarySource_UPCAST(pktin)->len + 1);
if (s->warn_kex) { if (s->warn_kex) {
ssh_set_frozen(ssh, 1); ssh_set_frozen(ssh, 1);
@ -8605,7 +8598,8 @@ static struct ssh_channel *ssh_channel_msg(Ssh ssh, PktIn *pktin)
} }
if (c->type == CHAN_SHARING) { if (c->type == CHAN_SHARING) {
share_got_pkt_from_server(c->u.sharing.ctx, pktin->type, share_got_pkt_from_server(c->u.sharing.ctx, pktin->type,
pktin->body, pktin->length); BinarySource_UPCAST(pktin)->data,
BinarySource_UPCAST(pktin)->len);
return NULL; return NULL;
} }
return c; return c;
@ -9389,7 +9383,8 @@ static void ssh2_msg_channel_open(Ssh ssh, PktIn *pktin)
* to sshshare.c. * to sshshare.c.
*/ */
share_got_pkt_from_server(realpf->share_ctx, pktin->type, share_got_pkt_from_server(realpf->share_ctx, pktin->type,
pktin->body, pktin->length); BinarySource_UPCAST(pktin)->data,
BinarySource_UPCAST(pktin)->len);
sfree(c); sfree(c);
return; return;
} }