The unified diff between revisions [c0d2ea57..] and [e24ccc23..] is displayed below. It can also be downloaded as a raw diff.

This diff has been restricted to the following files: 'netcmd.cc'

#
#
# patch "netcmd.cc"
#  from [7308c12cecebbd725ddca9ebfa94bd9a6e1efdea]
#    to [207caa3c268ad7e6a93eaff3f3298aa53f45fadd]
#
============================================================
--- netcmd.cc	7308c12cecebbd725ddca9ebfa94bd9a6e1efdea
+++ netcmd.cc	207caa3c268ad7e6a93eaff3f3298aa53f45fadd
@@ -49,8 +49,10 @@ netcmd::netcmd() : version(constants::ne
 }

 netcmd::netcmd() : version(constants::netcmd_current_protocol_version),
-                   cmd_code(bye_cmd)
+                   cmd_code(bye_cmd),
+                   payload_len(0), length_len(0)
 {}
+{}

 size_t netcmd::encoded_size()
 {
@@ -59,6 +61,17 @@ size_t netcmd::encoded_size()
   return 1 + 1 + tmp.size() + payload.size() + 4;
 }

+size_t netcmd::get_max_read()
+{
+  size_t ret = constants::netcmd_minsz + payload_len + length_len;
+  if (length_len > 0)
+    {
+      // netcmd_minsz already includes one byte for length_len
+      ret--;
+    }
+  return ret;
+}
+
 bool
 netcmd::operator==(netcmd const & other) const
 {
@@ -132,10 +145,11 @@ netcmd::read(string & inbuf, netsync_ses
     }

   // check to see if we have even enough bytes for a complete uleb128
-  size_t payload_len = 0;
+  size_t old_pos = pos;
   if (!try_extract_datum_uleb128<size_t>(inbuf, pos, "netcmd payload length",
       payload_len))
       return false;
+  length_len = pos - old_pos;

   // they might have given us a bogus size
   if (payload_len > constants::netcmd_payload_limit)
@@ -151,16 +165,21 @@ netcmd::read(string & inbuf, netsync_ses
 //  out.payload = extract_substring(inbuf, pos, payload_len, "netcmd payload");
   // Do this ourselves, so we can swap the strings instead of copying.
   require_bytes(inbuf, pos, payload_len, "netcmd payload");
-  payload = inbuf.substr(pos + payload_len);
-  inbuf.erase(pos + payload_len, inbuf.npos);
+  inbuf.erase(0, pos);
+  pos = payload_len;
+  u32 checksum = extract_datum_lsb<u32>(inbuf, pos, "netcmd checksum");
+  inbuf.resize(payload_len);
   inbuf.swap(payload);
-  size_t payload_pos = pos;
+
+  // we're done with inbuf
+  inbuf.clear();
   pos = 0;
+  payload_len = 0;
+  length_len = 0;

   // they might have given us bogus data
   string cmd_digest = extract_substring(inbuf, pos, CryptoPP::SHA::DIGESTSIZE,
                                         "netcmd HMAC");
-  inbuf.erase(0, pos);
   I(key().size() == CryptoPP::SHA::DIGESTSIZE);
   I(key().size() == hmac_val().size());
   byte keybuf[CryptoPP::SHA::DIGESTSIZE];
@@ -178,7 +197,6 @@ netcmd::read(string & inbuf, netsync_ses
     throw bad_decode(F("bad HMAC %s vs. %s") % encode_hexenc(cmd_digest)
                      % encode_hexenc(digest));
   hmac_val = netsync_hmac_value(digest);
-  payload.erase(0, payload_pos);

   return true;
 }