A bit of a bodge to avoid memcpy if zlib is disabled

--HG--
branch : nocircbuffer
This commit is contained in:
Matt Johnston 2015-03-01 00:57:21 +08:00
parent 989c5c1436
commit 579463933b
3 changed files with 18 additions and 10 deletions

View File

@ -534,8 +534,10 @@ void recv_msg_kexinit() {
buf_putstring(ses.kexhashbuf, buf_putstring(ses.kexhashbuf,
ses.transkexinit->data, ses.transkexinit->len); ses.transkexinit->data, ses.transkexinit->len);
/* I_S, the payload of the server's SSH_MSG_KEXINIT */ /* I_S, the payload of the server's SSH_MSG_KEXINIT */
buf_setpos(ses.payload, 0); buf_setpos(ses.payload, ses.payload_beginning);
buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); buf_putstring(ses.kexhashbuf,
buf_getptr(ses.payload, ses.payload->len-ses.payload->pos),
ses.payload->len-ses.payload->pos);
ses.requirenext = SSH_MSG_KEXDH_REPLY; ses.requirenext = SSH_MSG_KEXDH_REPLY;
} else { } else {
/* SERVER */ /* SERVER */
@ -549,8 +551,10 @@ void recv_msg_kexinit() {
(unsigned char*)LOCAL_IDENT, local_ident_len); (unsigned char*)LOCAL_IDENT, local_ident_len);
/* I_C, the payload of the client's SSH_MSG_KEXINIT */ /* I_C, the payload of the client's SSH_MSG_KEXINIT */
buf_setpos(ses.payload, 0); buf_setpos(ses.payload, ses.payload_beginning);
buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); buf_putstring(ses.kexhashbuf,
buf_getptr(ses.payload, ses.payload->len-ses.payload->pos),
ses.payload->len-ses.payload->pos);
/* I_S, the payload of the server's SSH_MSG_KEXINIT */ /* I_S, the payload of the server's SSH_MSG_KEXINIT */
buf_putstring(ses.kexhashbuf, buf_putstring(ses.kexhashbuf,

View File

@ -314,18 +314,21 @@ void decrypt_packet() {
if (is_compress_recv()) { if (is_compress_recv()) {
/* decompress */ /* decompress */
ses.payload = buf_decompress(ses.readbuf, len); ses.payload = buf_decompress(ses.readbuf, len);
buf_setpos(ses.payload, 0);
ses.payload_beginning = 0;
buf_free(ses.readbuf);
} else } else
#endif #endif
{ {
ses.payload = ses.readbuf;
ses.payload_beginning = ses.payload->pos;
buf_setlen(ses.payload, ses.payload->pos + len);
/* copy payload */ /* copy payload */
ses.payload = buf_new(len); //ses.payload = buf_new(len);
memcpy(ses.payload->data, buf_getptr(ses.readbuf, len), len); //memcpy(ses.payload->data, buf_getptr(ses.readbuf, len), len);
buf_incrlen(ses.payload, len); //buf_incrlen(ses.payload, len);
} }
buf_free(ses.readbuf);
ses.readbuf = NULL; ses.readbuf = NULL;
buf_setpos(ses.payload, 0);
ses.recvseq++; ses.recvseq++;

View File

@ -127,6 +127,7 @@ struct sshsession {
struct Queue writequeue; /* A queue of encrypted packets to send */ struct Queue writequeue; /* A queue of encrypted packets to send */
buffer *readbuf; /* From the wire, decrypted in-place */ buffer *readbuf; /* From the wire, decrypted in-place */
buffer *payload; /* Post-decompression, the actual SSH packet */ buffer *payload; /* Post-decompression, the actual SSH packet */
unsigned int payload_beginning;
unsigned int transseq, recvseq; /* Sequence IDs */ unsigned int transseq, recvseq; /* Sequence IDs */
/* Packet-handling flags */ /* Packet-handling flags */