From 8a7dd2f9b8c09aab9f89df3a04e8535109c263bc Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Sun, 16 Sep 2018 13:16:43 -0400 Subject: [PATCH] Fix peer_handler message serialization Fixes a bug introduced in 3e89106163b941aa4dc4ff92bdb484b7bbcf50c4 where messages were being encoded with their size instead of their type. Also utilizes the new size_hinting in peer_handler --- src/ln/peer_handler.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/src/ln/peer_handler.rs b/src/ln/peer_handler.rs index 52abecb4b..01416568b 100644 --- a/src/ln/peer_handler.rs +++ b/src/ln/peer_handler.rs @@ -1,7 +1,7 @@ use secp256k1::key::{SecretKey,PublicKey}; use ln::msgs; -use util::ser::{Writeable, Readable}; +use util::ser::{Writeable, Writer, Readable}; use ln::peer_channel_encryptor::{PeerChannelEncryptor,NextNoiseStep}; use util::byte_utils; use util::events::{EventsProvider,Event}; @@ -112,15 +112,23 @@ pub struct PeerManager { logger: Arc, } +struct VecWriter(Vec); +impl Writer for VecWriter { + fn write_all(&mut self, buf: &[u8]) -> Result<(), ::std::io::Error> { + self.0.extend_from_slice(buf); + Ok(()) + } + fn size_hint(&mut self, size: usize) { + self.0.reserve_exact(size); + } +} + macro_rules! encode_msg { ($msg: expr, $msg_code: expr) => {{ - let mut w = ::std::io::Cursor::new(vec![]); - 0u16.write(&mut w).unwrap(); - $msg.write(&mut w).unwrap(); - let mut msg = w.into_inner(); - let len = msg.len(); - msg[..2].copy_from_slice(&byte_utils::be16_to_array(len as u16 - 2)); - msg + let mut msg = VecWriter(Vec::new()); + ($msg_code as u16).write(&mut msg).unwrap(); + $msg.write(&mut msg).unwrap(); + msg.0 }} } -- 2.39.5