[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] packet: elide two buffer_prepend calls into one


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


References:
[PATCH] packet: elide two buffer_prepend calls into oneJon Simons <jon@xxxxxxxxxxxxx>
Re: [PATCH] packet: elide two buffer_prepend calls into oneAndreas Schneider <asn@xxxxxxxxxxxxxx>
Archive administrator: postmaster@lists.cynapses.org