@@ -282,12 +282,22 @@ pub(crate) enum ControlTlvs {
282282
283283impl Readable for ControlTlvs {
284284 fn read < R : Read > ( r : & mut R ) -> Result < Self , DecodeError > {
285- _init_and_read_tlv_stream ! ( r, {
285+ let mut custom_tlvs = Vec :: new ( ) ;
286+
287+ let tlv_len = BigSize :: read ( r) ?;
288+ let rd = FixedLengthReader :: new ( r, tlv_len. 0 ) ;
289+ _init_and_read_tlv_stream_with_custom_tlv_decode ! ( rd, {
286290 ( 1 , _padding, option) ,
287291 ( 2 , _short_channel_id, option) ,
288292 ( 4 , next_node_id, option) ,
289293 ( 6 , path_id, option) ,
290294 ( 8 , next_blinding_override, option) ,
295+ } , |msg_type: u64 , msg_reader: & mut FixedLengthReader <_>| -> Result <bool , DecodeError > {
296+ if msg_type < 1 << 16 { return Ok ( false ) }
297+ let mut value = Vec :: new( ) ;
298+ msg_reader. read_to_end( & mut value) ?;
299+ custom_tlvs. push( ( msg_type, value) ) ;
300+ Ok ( true )
291301 } ) ;
292302 let _padding: Option < Padding > = _padding;
293303 let _short_channel_id: Option < u64 > = _short_channel_id;
@@ -296,13 +306,15 @@ impl Readable for ControlTlvs {
296306 let valid_recv_fmt = next_node_id. is_none ( ) && next_blinding_override. is_none ( ) ;
297307
298308 let payload_fmt = if valid_fwd_fmt {
309+ if !custom_tlvs. is_empty ( ) { return Err ( DecodeError :: InvalidValue ) }
299310 ControlTlvs :: Forward ( ForwardTlvs {
300311 next_node_id : next_node_id. unwrap ( ) ,
301312 next_blinding_override,
302313 } )
303314 } else if valid_recv_fmt {
304315 ControlTlvs :: Receive ( ReceiveTlvs {
305316 path_id,
317+ custom_tlvs,
306318 } )
307319 } else {
308320 return Err ( DecodeError :: InvalidValue )
0 commit comments