# HG changeset patch # User Matt Johnston # Date 1425142641 -28800 # Node ID 4d7b4c5526c51eed411ec68fe40a73fabd6b2c6e # Parent c71df09bc61090efab303f8082f14a33c94eeb95 A bit of a bodge to avoid memcpy if zlib is disabled diff -r c71df09bc610 -r 4d7b4c5526c5 common-kex.c --- a/common-kex.c Sun Mar 01 00:44:45 2015 +0800 +++ b/common-kex.c Sun Mar 01 00:57:21 2015 +0800 @@ -534,8 +534,10 @@ buf_putstring(ses.kexhashbuf, ses.transkexinit->data, ses.transkexinit->len); /* I_S, the payload of the server's SSH_MSG_KEXINIT */ - buf_setpos(ses.payload, 0); - buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); + buf_setpos(ses.payload, ses.payload_beginning); + 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; } else { /* SERVER */ @@ -549,8 +551,10 @@ (unsigned char*)LOCAL_IDENT, local_ident_len); /* I_C, the payload of the client's SSH_MSG_KEXINIT */ - buf_setpos(ses.payload, 0); - buf_putstring(ses.kexhashbuf, ses.payload->data, ses.payload->len); + buf_setpos(ses.payload, ses.payload_beginning); + 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 */ buf_putstring(ses.kexhashbuf, diff -r c71df09bc610 -r 4d7b4c5526c5 packet.c --- a/packet.c Sun Mar 01 00:44:45 2015 +0800 +++ b/packet.c Sun Mar 01 00:57:21 2015 +0800 @@ -314,18 +314,21 @@ if (is_compress_recv()) { /* decompress */ ses.payload = buf_decompress(ses.readbuf, len); + buf_setpos(ses.payload, 0); + ses.payload_beginning = 0; + buf_free(ses.readbuf); } else #endif { + ses.payload = ses.readbuf; + ses.payload_beginning = ses.payload->pos; + buf_setlen(ses.payload, ses.payload->pos + len); /* copy payload */ - ses.payload = buf_new(len); - memcpy(ses.payload->data, buf_getptr(ses.readbuf, len), len); - buf_incrlen(ses.payload, len); + //ses.payload = buf_new(len); + //memcpy(ses.payload->data, buf_getptr(ses.readbuf, len), len); + //buf_incrlen(ses.payload, len); } - - buf_free(ses.readbuf); ses.readbuf = NULL; - buf_setpos(ses.payload, 0); ses.recvseq++; diff -r c71df09bc610 -r 4d7b4c5526c5 session.h --- a/session.h Sun Mar 01 00:44:45 2015 +0800 +++ b/session.h Sun Mar 01 00:57:21 2015 +0800 @@ -127,6 +127,7 @@ struct Queue writequeue; /* A queue of encrypted packets to send */ buffer *readbuf; /* From the wire, decrypted in-place */ buffer *payload; /* Post-decompression, the actual SSH packet */ + unsigned int payload_beginning; unsigned int transseq, recvseq; /* Sequence IDs */ /* Packet-handling flags */