Skip to content

Commit e946357

Browse files
authored
Merge pull request #523 from TheBlueMatt/2020-02-router-ser-fix
Fix Router Serialization Roundtrip
2 parents c1dc8e3 + 5f3986d commit e946357

File tree

15 files changed

+249
-240
lines changed

15 files changed

+249
-240
lines changed

fuzz/src/msg_targets/utils.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ macro_rules! test_msg {
2828
{
2929
use lightning::util::ser::{Writeable, Readable};
3030
let mut r = ::std::io::Cursor::new($data);
31-
if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) {
31+
if let Ok(msg) = <$MsgType as Readable>::read(&mut r) {
3232
let p = r.position() as usize;
3333
let mut w = VecWriter(Vec::new());
3434
msg.write(&mut w).unwrap();
@@ -48,11 +48,11 @@ macro_rules! test_msg_simple {
4848
{
4949
use lightning::util::ser::{Writeable, Readable};
5050
let mut r = ::std::io::Cursor::new($data);
51-
if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) {
51+
if let Ok(msg) = <$MsgType as Readable>::read(&mut r) {
5252
let mut w = VecWriter(Vec::new());
5353
msg.write(&mut w).unwrap();
5454

55-
let msg = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut ::std::io::Cursor::new(&w.0)).unwrap();
55+
let msg = <$MsgType as Readable>::read(&mut ::std::io::Cursor::new(&w.0)).unwrap();
5656
let mut w_two = VecWriter(Vec::new());
5757
msg.write(&mut w_two).unwrap();
5858
assert_eq!(&w.0[..], &w_two.0[..]);
@@ -69,7 +69,7 @@ macro_rules! test_msg_exact {
6969
{
7070
use lightning::util::ser::{Writeable, Readable};
7171
let mut r = ::std::io::Cursor::new($data);
72-
if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) {
72+
if let Ok(msg) = <$MsgType as Readable>::read(&mut r) {
7373
let mut w = VecWriter(Vec::new());
7474
msg.write(&mut w).unwrap();
7575
assert_eq!(&r.into_inner()[..], &w.0[..]);
@@ -86,7 +86,7 @@ macro_rules! test_msg_hole {
8686
{
8787
use lightning::util::ser::{Writeable, Readable};
8888
let mut r = ::std::io::Cursor::new($data);
89-
if let Ok(msg) = <$MsgType as Readable<::std::io::Cursor<&[u8]>>>::read(&mut r) {
89+
if let Ok(msg) = <$MsgType as Readable>::read(&mut r) {
9090
let mut w = VecWriter(Vec::new());
9191
msg.write(&mut w).unwrap();
9292
let p = w.0.len() as usize;

lightning/src/chain/keysinterface.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,8 +115,8 @@ impl Writeable for SpendableOutputDescriptor {
115115
}
116116
}
117117

118-
impl<R: ::std::io::Read> Readable<R> for SpendableOutputDescriptor {
119-
fn read(reader: &mut R) -> Result<Self, DecodeError> {
118+
impl Readable for SpendableOutputDescriptor {
119+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
120120
match Readable::read(reader)? {
121121
0u8 => Ok(SpendableOutputDescriptor::StaticOutput {
122122
outpoint: Readable::read(reader)?,
@@ -381,8 +381,8 @@ impl Writeable for InMemoryChannelKeys {
381381
}
382382
}
383383

384-
impl<R: ::std::io::Read> Readable<R> for InMemoryChannelKeys {
385-
fn read(reader: &mut R) -> Result<Self, DecodeError> {
384+
impl Readable for InMemoryChannelKeys {
385+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
386386
let funding_key = Readable::read(reader)?;
387387
let revocation_base_key = Readable::read(reader)?;
388388
let payment_base_key = Readable::read(reader)?;

lightning/src/ln/chan_utils.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,8 +156,8 @@ impl Writeable for CounterpartyCommitmentSecrets {
156156
Ok(())
157157
}
158158
}
159-
impl<R: ::std::io::Read> Readable<R> for CounterpartyCommitmentSecrets {
160-
fn read(reader: &mut R) -> Result<Self, DecodeError> {
159+
impl Readable for CounterpartyCommitmentSecrets {
160+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
161161
let mut old_secrets = [([0; 32], 1 << 48); 49];
162162
for &mut (ref mut secret, ref mut idx) in old_secrets.iter_mut() {
163163
*secret = Readable::read(reader)?;
@@ -607,8 +607,8 @@ impl Writeable for LocalCommitmentTransaction {
607607
Ok(())
608608
}
609609
}
610-
impl<R: ::std::io::Read> Readable<R> for LocalCommitmentTransaction {
611-
fn read(reader: &mut R) -> Result<Self, DecodeError> {
610+
impl Readable for LocalCommitmentTransaction {
611+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
612612
let tx = match Transaction::consensus_decode(reader.by_ref()) {
613613
Ok(tx) => tx,
614614
Err(e) => match e {

lightning/src/ln/channel.rs

Lines changed: 22 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3811,9 +3811,9 @@ impl Writeable for InboundHTLCRemovalReason {
38113811
}
38123812
}
38133813

3814-
impl<R: ::std::io::Read> Readable<R> for InboundHTLCRemovalReason {
3815-
fn read(reader: &mut R) -> Result<Self, DecodeError> {
3816-
Ok(match <u8 as Readable<R>>::read(reader)? {
3814+
impl Readable for InboundHTLCRemovalReason {
3815+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<Self, DecodeError> {
3816+
Ok(match <u8 as Readable>::read(reader)? {
38173817
0 => InboundHTLCRemovalReason::FailRelay(Readable::read(reader)?),
38183818
1 => InboundHTLCRemovalReason::FailMalformed((Readable::read(reader)?, Readable::read(reader)?)),
38193819
2 => InboundHTLCRemovalReason::Fulfill(Readable::read(reader)?),
@@ -3883,18 +3883,6 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
38833883
}
38843884
}
38853885

3886-
macro_rules! write_option {
3887-
($thing: expr) => {
3888-
match &$thing {
3889-
&None => 0u8.write(writer)?,
3890-
&Some(ref v) => {
3891-
1u8.write(writer)?;
3892-
v.write(writer)?;
3893-
},
3894-
}
3895-
}
3896-
}
3897-
38983886
(self.pending_outbound_htlcs.len() as u64).write(writer)?;
38993887
for htlc in self.pending_outbound_htlcs.iter() {
39003888
htlc.htlc_id.write(writer)?;
@@ -3912,15 +3900,15 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
39123900
},
39133901
&OutboundHTLCState::RemoteRemoved(ref fail_reason) => {
39143902
2u8.write(writer)?;
3915-
write_option!(*fail_reason);
3903+
fail_reason.write(writer)?;
39163904
},
39173905
&OutboundHTLCState::AwaitingRemoteRevokeToRemove(ref fail_reason) => {
39183906
3u8.write(writer)?;
3919-
write_option!(*fail_reason);
3907+
fail_reason.write(writer)?;
39203908
},
39213909
&OutboundHTLCState::AwaitingRemovedRemoteRevoke(ref fail_reason) => {
39223910
4u8.write(writer)?;
3923-
write_option!(*fail_reason);
3911+
fail_reason.write(writer)?;
39243912
},
39253913
}
39263914
}
@@ -3971,8 +3959,8 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
39713959
fail_reason.write(writer)?;
39723960
}
39733961

3974-
write_option!(self.pending_update_fee);
3975-
write_option!(self.holding_cell_update_fee);
3962+
self.pending_update_fee.write(writer)?;
3963+
self.holding_cell_update_fee.write(writer)?;
39763964

39773965
self.next_local_htlc_id.write(writer)?;
39783966
(self.next_remote_htlc_id - dropped_inbound_htlcs).write(writer)?;
@@ -3989,9 +3977,9 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
39893977
None => 0u8.write(writer)?,
39903978
}
39913979

3992-
write_option!(self.funding_txo);
3993-
write_option!(self.funding_tx_confirmed_in);
3994-
write_option!(self.short_channel_id);
3980+
self.funding_txo.write(writer)?;
3981+
self.funding_tx_confirmed_in.write(writer)?;
3982+
self.short_channel_id.write(writer)?;
39953983

39963984
self.last_block_connected.write(writer)?;
39973985
self.funding_tx_confirmations.write(writer)?;
@@ -4007,13 +3995,13 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
40073995
self.their_max_accepted_htlcs.write(writer)?;
40083996
self.minimum_depth.write(writer)?;
40093997

4010-
write_option!(self.their_pubkeys);
4011-
write_option!(self.their_cur_commitment_point);
3998+
self.their_pubkeys.write(writer)?;
3999+
self.their_cur_commitment_point.write(writer)?;
40124000

4013-
write_option!(self.their_prev_commitment_point);
4001+
self.their_prev_commitment_point.write(writer)?;
40144002
self.their_node_id.write(writer)?;
40154003

4016-
write_option!(self.their_shutdown_scriptpubkey);
4004+
self.their_shutdown_scriptpubkey.write(writer)?;
40174005

40184006
self.commitment_secrets.write(writer)?;
40194007

@@ -4022,8 +4010,8 @@ impl<ChanSigner: ChannelKeys + Writeable> Writeable for Channel<ChanSigner> {
40224010
}
40234011
}
40244012

4025-
impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R, Arc<Logger>> for Channel<ChanSigner> {
4026-
fn read(reader: &mut R, logger: Arc<Logger>) -> Result<Self, DecodeError> {
4013+
impl<ChanSigner: ChannelKeys + Readable> ReadableArgs<Arc<Logger>> for Channel<ChanSigner> {
4014+
fn read<R : ::std::io::Read>(reader: &mut R, logger: Arc<Logger>) -> Result<Self, DecodeError> {
40274015
let _ver: u8 = Readable::read(reader)?;
40284016
let min_ver: u8 = Readable::read(reader)?;
40294017
if min_ver > SERIALIZATION_VERSION {
@@ -4056,7 +4044,7 @@ impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R,
40564044
amount_msat: Readable::read(reader)?,
40574045
cltv_expiry: Readable::read(reader)?,
40584046
payment_hash: Readable::read(reader)?,
4059-
state: match <u8 as Readable<R>>::read(reader)? {
4047+
state: match <u8 as Readable>::read(reader)? {
40604048
1 => InboundHTLCState::AwaitingRemoteRevokeToAnnounce(Readable::read(reader)?),
40614049
2 => InboundHTLCState::AwaitingAnnouncedRemoteRevoke(Readable::read(reader)?),
40624050
3 => InboundHTLCState::Committed,
@@ -4075,7 +4063,7 @@ impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R,
40754063
cltv_expiry: Readable::read(reader)?,
40764064
payment_hash: Readable::read(reader)?,
40774065
source: Readable::read(reader)?,
4078-
state: match <u8 as Readable<R>>::read(reader)? {
4066+
state: match <u8 as Readable>::read(reader)? {
40794067
0 => OutboundHTLCState::LocalAnnounced(Box::new(Readable::read(reader)?)),
40804068
1 => OutboundHTLCState::Committed,
40814069
2 => OutboundHTLCState::RemoteRemoved(Readable::read(reader)?),
@@ -4089,7 +4077,7 @@ impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R,
40894077
let holding_cell_htlc_update_count: u64 = Readable::read(reader)?;
40904078
let mut holding_cell_htlc_updates = Vec::with_capacity(cmp::min(holding_cell_htlc_update_count as usize, OUR_MAX_HTLCS as usize*2));
40914079
for _ in 0..holding_cell_htlc_update_count {
4092-
holding_cell_htlc_updates.push(match <u8 as Readable<R>>::read(reader)? {
4080+
holding_cell_htlc_updates.push(match <u8 as Readable>::read(reader)? {
40934081
0 => HTLCUpdateAwaitingACK::AddHTLC {
40944082
amount_msat: Readable::read(reader)?,
40954083
cltv_expiry: Readable::read(reader)?,
@@ -4109,7 +4097,7 @@ impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R,
41094097
});
41104098
}
41114099

4112-
let resend_order = match <u8 as Readable<R>>::read(reader)? {
4100+
let resend_order = match <u8 as Readable>::read(reader)? {
41134101
0 => RAACommitmentOrder::CommitmentFirst,
41144102
1 => RAACommitmentOrder::RevokeAndACKFirst,
41154103
_ => return Err(DecodeError::InvalidValue),
@@ -4139,7 +4127,7 @@ impl<R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>> ReadableArgs<R,
41394127
let channel_update_count = Readable::read(reader)?;
41404128
let feerate_per_kw = Readable::read(reader)?;
41414129

4142-
let last_sent_closing_fee = match <u8 as Readable<R>>::read(reader)? {
4130+
let last_sent_closing_fee = match <u8 as Readable>::read(reader)? {
41434131
0 => None,
41444132
1 => Some((Readable::read(reader)?, Readable::read(reader)?, Readable::read(reader)?)),
41454133
_ => return Err(DecodeError::InvalidValue),

lightning/src/ln/channelmanager.rs

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3062,8 +3062,8 @@ impl Writeable for PendingHTLCInfo {
30623062
}
30633063
}
30643064

3065-
impl<R: ::std::io::Read> Readable<R> for PendingHTLCInfo {
3066-
fn read(reader: &mut R) -> Result<PendingHTLCInfo, DecodeError> {
3065+
impl Readable for PendingHTLCInfo {
3066+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<PendingHTLCInfo, DecodeError> {
30673067
Ok(PendingHTLCInfo {
30683068
onion_packet: Readable::read(reader)?,
30693069
incoming_shared_secret: Readable::read(reader)?,
@@ -3091,9 +3091,9 @@ impl Writeable for HTLCFailureMsg {
30913091
}
30923092
}
30933093

3094-
impl<R: ::std::io::Read> Readable<R> for HTLCFailureMsg {
3095-
fn read(reader: &mut R) -> Result<HTLCFailureMsg, DecodeError> {
3096-
match <u8 as Readable<R>>::read(reader)? {
3094+
impl Readable for HTLCFailureMsg {
3095+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<HTLCFailureMsg, DecodeError> {
3096+
match <u8 as Readable>::read(reader)? {
30973097
0 => Ok(HTLCFailureMsg::Relay(Readable::read(reader)?)),
30983098
1 => Ok(HTLCFailureMsg::Malformed(Readable::read(reader)?)),
30993099
_ => Err(DecodeError::InvalidValue),
@@ -3117,9 +3117,9 @@ impl Writeable for PendingHTLCStatus {
31173117
}
31183118
}
31193119

3120-
impl<R: ::std::io::Read> Readable<R> for PendingHTLCStatus {
3121-
fn read(reader: &mut R) -> Result<PendingHTLCStatus, DecodeError> {
3122-
match <u8 as Readable<R>>::read(reader)? {
3120+
impl Readable for PendingHTLCStatus {
3121+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<PendingHTLCStatus, DecodeError> {
3122+
match <u8 as Readable>::read(reader)? {
31233123
0 => Ok(PendingHTLCStatus::Forward(Readable::read(reader)?)),
31243124
1 => Ok(PendingHTLCStatus::Fail(Readable::read(reader)?)),
31253125
_ => Err(DecodeError::InvalidValue),
@@ -3151,9 +3151,9 @@ impl Writeable for HTLCSource {
31513151
}
31523152
}
31533153

3154-
impl<R: ::std::io::Read> Readable<R> for HTLCSource {
3155-
fn read(reader: &mut R) -> Result<HTLCSource, DecodeError> {
3156-
match <u8 as Readable<R>>::read(reader)? {
3154+
impl Readable for HTLCSource {
3155+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<HTLCSource, DecodeError> {
3156+
match <u8 as Readable>::read(reader)? {
31573157
0 => Ok(HTLCSource::PreviousHopData(Readable::read(reader)?)),
31583158
1 => Ok(HTLCSource::OutboundRoute {
31593159
route: Readable::read(reader)?,
@@ -3182,9 +3182,9 @@ impl Writeable for HTLCFailReason {
31823182
}
31833183
}
31843184

3185-
impl<R: ::std::io::Read> Readable<R> for HTLCFailReason {
3186-
fn read(reader: &mut R) -> Result<HTLCFailReason, DecodeError> {
3187-
match <u8 as Readable<R>>::read(reader)? {
3185+
impl Readable for HTLCFailReason {
3186+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<HTLCFailReason, DecodeError> {
3187+
match <u8 as Readable>::read(reader)? {
31883188
0 => Ok(HTLCFailReason::LightningError { err: Readable::read(reader)? }),
31893189
1 => Ok(HTLCFailReason::Reason {
31903190
failure_code: Readable::read(reader)?,
@@ -3214,9 +3214,9 @@ impl Writeable for HTLCForwardInfo {
32143214
}
32153215
}
32163216

3217-
impl<R: ::std::io::Read> Readable<R> for HTLCForwardInfo {
3218-
fn read(reader: &mut R) -> Result<HTLCForwardInfo, DecodeError> {
3219-
match <u8 as Readable<R>>::read(reader)? {
3217+
impl Readable for HTLCForwardInfo {
3218+
fn read<R: ::std::io::Read>(reader: &mut R) -> Result<HTLCForwardInfo, DecodeError> {
3219+
match <u8 as Readable>::read(reader)? {
32203220
0 => Ok(HTLCForwardInfo::AddHTLC {
32213221
prev_short_channel_id: Readable::read(reader)?,
32223222
prev_htlc_id: Readable::read(reader)?,
@@ -3353,14 +3353,29 @@ pub struct ChannelManagerReadArgs<'a, ChanSigner: 'a + ChannelKeys, M: Deref, T:
33533353
pub channel_monitors: &'a mut HashMap<OutPoint, &'a mut ChannelMonitor<ChanSigner>>,
33543354
}
33553355

3356-
impl<'a, R : ::std::io::Read, ChanSigner: ChannelKeys + Readable<R>, M: Deref, T: Deref, K: Deref, F: Deref>
3357-
ReadableArgs<R, ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>> for (Sha256dHash, ChannelManager<ChanSigner, M, T, K, F>)
3356+
// Implement ReadableArgs for an Arc'd ChannelManager to make it a bit easier to work with the
3357+
// SipmleArcChannelManager type:
3358+
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref>
3359+
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>> for (Sha256dHash, Arc<ChannelManager<ChanSigner, M, T, K, F>>)
33583360
where M::Target: ManyChannelMonitor<ChanSigner>,
33593361
T::Target: BroadcasterInterface,
33603362
K::Target: KeysInterface<ChanKeySigner = ChanSigner>,
33613363
F::Target: FeeEstimator,
33623364
{
3363-
fn read(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result<Self, DecodeError> {
3365+
fn read<R: ::std::io::Read>(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result<Self, DecodeError> {
3366+
let (blockhash, chan_manager) = <(Sha256dHash, ChannelManager<ChanSigner, M, T, K, F>)>::read(reader, args)?;
3367+
Ok((blockhash, Arc::new(chan_manager)))
3368+
}
3369+
}
3370+
3371+
impl<'a, ChanSigner: ChannelKeys + Readable, M: Deref, T: Deref, K: Deref, F: Deref>
3372+
ReadableArgs<ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>> for (Sha256dHash, ChannelManager<ChanSigner, M, T, K, F>)
3373+
where M::Target: ManyChannelMonitor<ChanSigner>,
3374+
T::Target: BroadcasterInterface,
3375+
K::Target: KeysInterface<ChanKeySigner = ChanSigner>,
3376+
F::Target: FeeEstimator,
3377+
{
3378+
fn read<R: ::std::io::Read>(reader: &mut R, args: ChannelManagerReadArgs<'a, ChanSigner, M, T, K, F>) -> Result<Self, DecodeError> {
33643379
let _ver: u8 = Readable::read(reader)?;
33653380
let min_ver: u8 = Readable::read(reader)?;
33663381
if min_ver > SERIALIZATION_VERSION {

0 commit comments

Comments
 (0)