Skip to content

Commit 3cfa29a

Browse files
committed
f handle no-event-but-action case
1 parent f3d944d commit 3cfa29a

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
@@ -7258,8 +7258,20 @@ where
72587258
impl Writeable for VecDeque<(Event, Option<EventCompletionAction>)> {
72597259
fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
72607260
(self.len() as u64).write(w)?;
7261-
for elem in self.iter() {
7262-
elem.write(w)?;
7261+
for (event, action) in self.iter() {
7262+
event.write(w)?;
7263+
action.write(w)?;
7264+
#[cfg(debug_assertions)] {
7265+
// Events are MaybeReadable, in some cases indicating that they shouldn't actually
7266+
// be persisted and are regenerated on restart. However, if such an event has a
7267+
// post-event-handling action we'll write nothing for the event and would have to
7268+
// either forget the action or fail on deserialization (which we do below). Thus,
7269+
// check that the event is sane here.
7270+
let event_encoded = event.encode();
7271+
let event_read: Option<Event> =
7272+
MaybeReadable::read(&mut &event_encoded[..]).unwrap();
7273+
if action.is_some() { assert!(event_read.is_some()); }
7274+
}
72637275
}
72647276
Ok(())
72657277
}
@@ -7268,14 +7280,16 @@ impl Readable for VecDeque<(Event, Option<EventCompletionAction>)> {
72687280
fn read<R: Read>(reader: &mut R) -> Result<Self, DecodeError> {
72697281
let len: u64 = Readable::read(reader)?;
72707282
const MAX_ALLOC_SIZE: u64 = 1024 * 16;
7271-
let mut events = VecDeque::with_capacity(cmp::min(
7283+
let mut events: Self = VecDeque::with_capacity(cmp::min(
72727284
MAX_ALLOC_SIZE/mem::size_of::<(events::Event, Option<EventCompletionAction>)>() as u64,
72737285
len) as usize);
72747286
for _ in 0..len {
72757287
let ev_opt = MaybeReadable::read(reader)?;
72767288
let action = Readable::read(reader)?;
72777289
if let Some(ev) = ev_opt {
72787290
events.push_back((ev, action));
7291+
} else if action.is_some() {
7292+
return Err(DecodeError::InvalidValue);
72797293
}
72807294
}
72817295
Ok(events)

0 commit comments

Comments
 (0)