@@ -1201,8 +1201,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1201
1201
Ok ( x) => x,
1202
1202
Err ( e) => {
1203
1203
match e. action {
1204
- msgs:: ErrorAction :: DisconnectPeer { msg: _ } => {
1205
- //TODO: Try to push msg
1204
+ msgs:: ErrorAction :: DisconnectPeer { .. } => {
1205
+ // We may have an `ErrorMessage` to send to the peer,
1206
+ // but writing to the socket while reading can lead to
1207
+ // re-entrant code and possibly unexpected behavior. The
1208
+ // message send is optimistic anyway, and in this case
1209
+ // we immediately disconnect the peer.
1210
+ log_debug!( self . logger, "Error handling message{}; disconnecting peer with: {}" , OptionalFromDebugger ( & peer_node_id) , e. err) ;
1211
+ return Err ( PeerHandleError { } ) ;
1212
+ } ,
1213
+ msgs:: ErrorAction :: DisconnectPeerWithWarning { .. } => {
1214
+ // We have a `WarningMessage` to send to the peer, but
1215
+ // writing to the socket while reading can lead to
1216
+ // re-entrant code and possibly unexpected behavior. The
1217
+ // message send is optimistic anyway, and in this case
1218
+ // we immediately disconnect the peer.
1206
1219
log_debug!( self . logger, "Error handling message{}; disconnecting peer with: {}" , OptionalFromDebugger ( & peer_node_id) , e. err) ;
1207
1220
return Err ( PeerHandleError { } ) ;
1208
1221
} ,
@@ -1337,7 +1350,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1337
1350
Ok ( x) => x,
1338
1351
Err ( e) => {
1339
1352
match e {
1340
- // Note that to avoid recursion we never call
1353
+ // Note that to avoid re-entrancy we never call
1341
1354
// `do_attempt_write_data` from here, causing
1342
1355
// the messages enqueued here to not actually
1343
1356
// be sent before the peer is disconnected.
@@ -2046,13 +2059,29 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2046
2059
log_pubkey!( node_id) , msg. contents. short_channel_id) ;
2047
2060
self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2048
2061
} ,
2049
- MessageSendEvent :: HandleError { ref node_id, ref action } => {
2050
- match * action {
2051
- msgs:: ErrorAction :: DisconnectPeer { ref msg } => {
2062
+ MessageSendEvent :: HandleError { node_id, action } => {
2063
+ match action {
2064
+ msgs:: ErrorAction :: DisconnectPeer { msg } => {
2065
+ if let Some ( msg) = msg. as_ref ( ) {
2066
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2067
+ log_pubkey!( node_id) , msg. data) ;
2068
+ } else {
2069
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {}" ,
2070
+ log_pubkey!( node_id) ) ;
2071
+ }
2072
+ // We do not have the peers write lock, so we just store that we're
2073
+ // about to disconenct the peer and do it after we finish
2074
+ // processing most messages.
2075
+ let msg = msg. map ( |msg| wire:: Message :: < <<CMH as core:: ops:: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > :: Error ( msg) ) ;
2076
+ peers_to_disconnect. insert ( node_id, msg) ;
2077
+ } ,
2078
+ msgs:: ErrorAction :: DisconnectPeerWithWarning { msg } => {
2079
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2080
+ log_pubkey!( node_id) , msg. data) ;
2052
2081
// We do not have the peers write lock, so we just store that we're
2053
2082
// about to disconenct the peer and do it after we finish
2054
2083
// processing most messages.
2055
- peers_to_disconnect. insert ( * node_id, msg . clone ( ) ) ;
2084
+ peers_to_disconnect. insert ( node_id, Some ( wire :: Message :: Warning ( msg ) ) ) ;
2056
2085
} ,
2057
2086
msgs:: ErrorAction :: IgnoreAndLog ( level) => {
2058
2087
log_given_level ! ( self . logger, level, "Received a HandleError event to be ignored for node {}" , log_pubkey!( node_id) ) ;
@@ -2065,13 +2094,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2065
2094
log_trace ! ( self . logger, "Handling SendErrorMessage HandleError event in peer_handler for node {} with message {}" ,
2066
2095
log_pubkey!( node_id) ,
2067
2096
msg. data) ;
2068
- self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2097
+ self . enqueue_message ( & mut * get_peer_for_forwarding ! ( & node_id) , msg) ;
2069
2098
} ,
2070
2099
msgs:: ErrorAction :: SendWarningMessage { ref msg, ref log_level } => {
2071
2100
log_given_level ! ( self . logger, * log_level, "Handling SendWarningMessage HandleError event in peer_handler for node {} with message {}" ,
2072
2101
log_pubkey!( node_id) ,
2073
2102
msg. data) ;
2074
- self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2103
+ self . enqueue_message ( & mut * get_peer_for_forwarding ! ( & node_id) , msg) ;
2075
2104
} ,
2076
2105
}
2077
2106
} ,
@@ -2121,9 +2150,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2121
2150
if let Some ( peer_mutex) = peers. remove ( & descriptor) {
2122
2151
let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
2123
2152
if let Some ( msg) = msg {
2124
- log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2125
- log_pubkey!( node_id) ,
2126
- msg. data) ;
2127
2153
self . enqueue_message ( & mut * peer, & msg) ;
2128
2154
// This isn't guaranteed to work, but if there is enough free
2129
2155
// room in the send buffer, put the error message there...
0 commit comments