From d12fe799eb2660ab925c5baffd53bccbdff9899b Mon Sep 17 00:00:00 2001 From: teebaumcrypto <72811287+teebaumcrypto@users.noreply.github.com> Date: Sat, 29 Jun 2024 20:08:16 +0200 Subject: [PATCH] fix(network): handle end of list in tx monitor response (#305) --- .../src/miniprotocols/txmonitor/codec.rs | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/pallas-network/src/miniprotocols/txmonitor/codec.rs b/pallas-network/src/miniprotocols/txmonitor/codec.rs index 15da33c..0bbc5b8 100644 --- a/pallas-network/src/miniprotocols/txmonitor/codec.rs +++ b/pallas-network/src/miniprotocols/txmonitor/codec.rs @@ -80,14 +80,19 @@ impl<'b> Decode<'b, ()> for Message { // find the specs 4 => Ok(Message::AwaitAcquire), 5 => Ok(Message::RequestNextTx), - 6 => match d.datatype()? { - pallas_codec::minicbor::data::Type::Array - | pallas_codec::minicbor::data::Type::ArrayIndef => { - let tx = d.decode()?; - Ok(Message::ResponseNextTx(Some(tx))) - } - _ => Ok(Message::ResponseNextTx(None)), - }, + 6 => match d.datatype() { + Ok(datatype) => { + match datatype { + pallas_codec::minicbor::data::Type::Array + | pallas_codec::minicbor::data::Type::ArrayIndef => { + let tx = d.decode()?; + Ok(Message::ResponseNextTx(Some(tx))) + } + _ => Ok(Message::ResponseNextTx(None)) + } + }, + Err(_) => Ok(Message::ResponseNextTx(None)) + } 7 => { let id = d.decode()?; Ok(Message::RequestHasTx(id)) @@ -130,4 +135,15 @@ pub mod tests { unreachable!(); } } + #[test] + fn test_empty_next_tx_response() { + let bytes = vec![129, 6]; + let msg: super::Message = pallas_codec::minicbor::decode(&bytes).unwrap(); + + if let super::Message::ResponseNextTx(None) = msg { + assert_eq!(0u64, 0u64); + } else { + unreachable!(); + } + } }