[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH] packet: elide two buffer_prepend calls into one
[Thread Prev] | [Thread Next]
- Subject: Re: [PATCH] packet: elide two buffer_prepend calls into one
- From: Jon Simons <jon@xxxxxxxxxxxxx>
- Reply-to: libssh@xxxxxxxxxx
- Date: Thu, 06 Feb 2014 12:43:01 -0800
- To: Andreas Schneider <asn@xxxxxxxxxxxxxx>
- Cc: libssh@xxxxxxxxxx
On 2/6/14, 1:27 AM, Andreas Schneider wrote: .. > I prefrer > > rc = buffer_prepend_data(session->out_buffer, &header, sizeof(header); > if (rc < 0) { Thanks, Andreas -- attached is an updated patch that stores the results of buffer_prepend_data and buffer_add_data explicitly; everything else remains the same as the first revision. -Jon
From dcc919f13d1ad62331d1937550e8269e367c2595 Mon Sep 17 00:00:00 2001 From: Jon Simons <jon@xxxxxxxxxxxxx> Date: Thu, 6 Feb 2014 12:37:02 -0800 Subject: [PATCH] packet: elide two buffer_prepend calls into one In packet_send2, rather than issue two separate buffer_prepend_data calls (each of which may entail realloc + memmove + memcpy), elide the prepend work into a single buffer_prepend_data: the header information is computed locally, and a single 5 byte prepend operation is now done instead of prepending 1, then 4 bytes. --- src/packet.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/packet.c b/src/packet.c index 75f6b58..c4fb2a1 100644 --- a/src/packet.c +++ b/src/packet.c @@ -498,11 +498,13 @@ static int packet_send2(ssh_session session) { session->current_crypto->out_cipher->blocksize : 8); uint32_t currentlen = buffer_get_rest_len(session->out_buffer); unsigned char *hmac = NULL; - char padstring[32] = {0}; + char padstring[32] = { 0 }; int rc = SSH_ERROR; uint32_t finallen,payloadsize,compsize; uint8_t padding; + uint8_t header[sizeof(padding) + sizeof(finallen)] = { 0 }; + payloadsize = currentlen; #ifdef WITH_ZLIB if (session->current_crypto @@ -522,19 +524,18 @@ static int packet_send2(ssh_session session) { if (session->current_crypto) { ssh_get_random(padstring, padding, 0); - } else { - memset(padstring,0,padding); } finallen = htonl(currentlen + padding + 1); - if (buffer_prepend_data(session->out_buffer, &padding, sizeof(uint8_t)) < 0) { - goto error; - } - if (buffer_prepend_data(session->out_buffer, &finallen, sizeof(uint32_t)) < 0) { + memcpy(&header[0], &finallen, sizeof(finallen)); + header[sizeof(finallen)] = padding; + rc = buffer_prepend_data(session->out_buffer, &header, sizeof(header)); + if (rc < 0) { goto error; } - if (buffer_add_data(session->out_buffer, padstring, padding) < 0) { + rc = buffer_add_data(session->out_buffer, padstring, padding); + if (rc < 0) { goto error; } #ifdef WITH_PCAP -- 1.8.4.21.g992c386
[PATCH] packet: elide two buffer_prepend calls into one | Jon Simons <jon@xxxxxxxxxxxxx> |
Re: [PATCH] packet: elide two buffer_prepend calls into one | Andreas Schneider <asn@xxxxxxxxxxxxxx> |