Skip to content

Commit 32d3dbe

Browse files
committed
f handle no-event-but-action case
1 parent 9519b27 commit 32d3dbe

File tree

1 file changed

+17
-3
lines changed

1 file changed

+17
-3
lines changed

lightning/src/ln/channelmanager.rs

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7356,8 +7356,20 @@ where
73567356
impl Writeable for VecDeque<(Event, Option<EventCompletionAction>)> {
73577357
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
73587358
(self.len() as u64).write(w)?;
7359-
for elem in self.iter() {
7360-
elem.write(w)?;
7359+
for (event, action) in self.iter() {
7360+
event.write(w)?;
7361+
action.write(w)?;
7362+
#[cfg(debug_assertions)] {
7363+
// Events are MaybeReadable, in some cases indicating that they shouldn't actually
7364+
// be persisted and are regenerated on restart. However, if such an event has a
7365+
// post-event-handling action we'll write nothing for the event and would have to
7366+
// either forget the action or fail on deserialization (which we do below). Thus,
7367+
// check that the event is sane here.
7368+
let event_encoded = event.encode();
7369+
let event_read: Option<Event> =
7370+
MaybeReadable::read(&mut &event_encoded[..]).unwrap();
7371+
if action.is_some() { assert!(event_read.is_some()); }
7372+
}
73617373
}
73627374
Ok(())
73637375
}
@@ -7366,14 +7378,16 @@ impl Readable for VecDeque<(Event, Option<EventCompletionAction>)> {
73667378
fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
73677379
let len: u64 = Readable::read(reader)?;
73687380
const MAX_ALLOC_SIZE: u64 = 1024 * 16;
7369-
let mut events = VecDeque::with_capacity(cmp::min(
7381+
let mut events: Self = VecDeque::with_capacity(cmp::min(
73707382
MAX_ALLOC_SIZE/mem::size_of::<(events::Event, Option<EventCompletionAction>)>() as u64,
73717383
len) as usize);
73727384
for _ in 0..len {
73737385
let ev_opt = MaybeReadable::read(reader)?;
73747386
let action = Readable::read(reader)?;
73757387
if let Some(ev) = ev_opt {
73767388
events.push_back((ev, action));
7389+
} else if action.is_some() {
7390+
return Err(DecodeError::InvalidValue);
73777391
}
73787392
}
73797393
Ok(events)

0 commit comments

Comments
 (0)