@@ -965,38 +965,42 @@ where
965965 }
966966 let mut res: Option < FailureLearnings > = None ;
967967 let mut htlc_msat = * first_hop_htlc_msat;
968- let mut error_code_ret = None ;
969- let mut error_packet_ret = None ;
968+ let mut _error_code_ret = None ;
969+ let mut _error_packet_ret = None ;
970970 let mut is_from_final_node = false ;
971971
972972 const BADONION : u16 = 0x8000 ;
973973 const PERM : u16 = 0x4000 ;
974974 const NODE : u16 = 0x2000 ;
975975 const UPDATE : u16 = 0x1000 ;
976976
977- // Handle packed channel/node updates for passing back for the route handler
978- let callback = |shared_secret : SharedSecret ,
979- _,
980- _,
981- route_hop_opt : Option < & RouteHop > ,
982- route_hop_idx| {
983- if res. is_some ( ) {
984- return ;
985- }
977+ let mut onion_keys = Vec :: with_capacity ( path. hops . len ( ) ) ;
978+ construct_onion_keys_generic_callback (
979+ secp_ctx,
980+ & path. hops ,
981+ path. blinded_tail . as_ref ( ) ,
982+ session_priv,
983+ |shared_secret, _, _, route_hop_option : Option < & RouteHop > , _| {
984+ onion_keys. push ( ( route_hop_option. cloned ( ) , shared_secret) )
985+ } ,
986+ )
987+ . expect ( "Route we used spontaneously grew invalid keys in the middle of it?" ) ;
986988
987- let route_hop = match route_hop_opt {
989+ // Handle packed channel/node updates for passing back for the route handler
990+ for ( route_hop_idx, ( route_hop_option, shared_secret) ) in onion_keys. into_iter ( ) . enumerate ( ) {
991+ let route_hop = match route_hop_option. as_ref ( ) {
988992 Some ( hop) => hop,
989993 None => {
990994 // Got an error from within a blinded route.
991- error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
992- error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
995+ _error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
996+ _error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
993997 res = Some ( FailureLearnings {
994998 network_update : None ,
995999 short_channel_id : None ,
9961000 payment_failed_permanently : false ,
9971001 failed_within_blinded_path : true ,
9981002 } ) ;
999- return ;
1003+ break ;
10001004 } ,
10011005 } ;
10021006
@@ -1014,8 +1018,8 @@ where
10141018 // The failing hop is within a multi-hop blinded path.
10151019 #[ cfg( not( test) ) ]
10161020 {
1017- error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
1018- error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
1021+ _error_code_ret = Some ( BADONION | PERM | 24 ) ; // invalid_onion_blinding
1022+ _error_packet_ret = Some ( vec ! [ 0 ; 32 ] ) ;
10191023 }
10201024 #[ cfg( test) ]
10211025 {
@@ -1026,10 +1030,10 @@ where
10261030 & encrypted_packet. data ,
10271031 ) )
10281032 . unwrap ( ) ;
1029- error_code_ret = Some ( u16:: from_be_bytes (
1033+ _error_code_ret = Some ( u16:: from_be_bytes (
10301034 err_packet. failuremsg . get ( 0 ..2 ) . unwrap ( ) . try_into ( ) . unwrap ( ) ,
10311035 ) ) ;
1032- error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1036+ _error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
10331037 }
10341038
10351039 res = Some ( FailureLearnings {
@@ -1038,7 +1042,7 @@ where
10381042 payment_failed_permanently : false ,
10391043 failed_within_blinded_path : true ,
10401044 } ) ;
1041- return ;
1045+ break ;
10421046 } ,
10431047 }
10441048 } ;
@@ -1053,7 +1057,7 @@ where
10531057 hmac. input ( & encrypted_packet. data [ 32 ..] ) ;
10541058
10551059 if !fixed_time_eq ( & Hmac :: from_engine ( hmac) . to_byte_array ( ) , & encrypted_packet. data [ ..32 ] ) {
1056- return ;
1060+ continue ;
10571061 }
10581062
10591063 let err_packet =
@@ -1073,7 +1077,7 @@ where
10731077 payment_failed_permanently : is_from_final_node,
10741078 failed_within_blinded_path : false ,
10751079 } ) ;
1076- return ;
1080+ break ;
10771081 } ,
10781082 } ;
10791083
@@ -1095,13 +1099,13 @@ where
10951099 payment_failed_permanently : is_from_final_node,
10961100 failed_within_blinded_path : false ,
10971101 } ) ;
1098- return ;
1102+ break ;
10991103 } ,
11001104 } ;
11011105
11021106 let error_code = u16:: from_be_bytes ( error_code_slice. try_into ( ) . expect ( "len is 2" ) ) ;
1103- error_code_ret = Some ( error_code) ;
1104- error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
1107+ _error_code_ret = Some ( error_code) ;
1108+ _error_packet_ret = Some ( err_packet. failuremsg [ 2 ..] . to_vec ( ) ) ;
11051109
11061110 let ( debug_field, debug_field_size) = errors:: get_onion_debug_field ( error_code) ;
11071111
@@ -1212,16 +1216,9 @@ where
12121216 description
12131217 ) ;
12141218 }
1215- } ;
12161219
1217- construct_onion_keys_generic_callback (
1218- secp_ctx,
1219- & path. hops ,
1220- path. blinded_tail . as_ref ( ) ,
1221- session_priv,
1222- callback,
1223- )
1224- . expect ( "Route we used spontaneously grew invalid keys in the middle of it?" ) ;
1220+ break ;
1221+ }
12251222
12261223 if let Some ( FailureLearnings {
12271224 network_update,
@@ -1236,9 +1233,9 @@ where
12361233 payment_failed_permanently,
12371234 failed_within_blinded_path,
12381235 #[ cfg( any( test, feature = "_test_utils" ) ) ]
1239- onion_error_code : error_code_ret ,
1236+ onion_error_code : _error_code_ret ,
12401237 #[ cfg( any( test, feature = "_test_utils" ) ) ]
1241- onion_error_data : error_packet_ret ,
1238+ onion_error_data : _error_packet_ret ,
12421239 }
12431240 } else {
12441241 // only not set either packet unparseable or hmac does not match with any
0 commit comments