@@ -1230,8 +1230,21 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1230
1230
Ok ( x) => x,
1231
1231
Err ( e) => {
1232
1232
match e. action {
1233
- msgs:: ErrorAction :: DisconnectPeer { msg: _ } => {
1234
- //TODO: Try to push msg
1233
+ msgs:: ErrorAction :: DisconnectPeer { .. } => {
1234
+ // We may have an `ErrorMessage` to send to the peer,
1235
+ // but writing to the socket while reading can lead to
1236
+ // re-entrant code and possibly unexpected behavior. The
1237
+ // message send is optimistic anyway, and in this case
1238
+ // we immediately disconnect the peer.
1239
+ log_debug!( self . logger, "Error handling message{}; disconnecting peer with: {}" , OptionalFromDebugger ( & peer_node_id) , e. err) ;
1240
+ return Err ( PeerHandleError { } ) ;
1241
+ } ,
1242
+ msgs:: ErrorAction :: DisconnectPeerWithWarning { .. } => {
1243
+ // We have a `WarningMessage` to send to the peer, but
1244
+ // writing to the socket while reading can lead to
1245
+ // re-entrant code and possibly unexpected behavior. The
1246
+ // message send is optimistic anyway, and in this case
1247
+ // we immediately disconnect the peer.
1235
1248
log_debug!( self . logger, "Error handling message{}; disconnecting peer with: {}" , OptionalFromDebugger ( & peer_node_id) , e. err) ;
1236
1249
return Err ( PeerHandleError { } ) ;
1237
1250
} ,
@@ -1362,7 +1375,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
1362
1375
Ok ( x) => x,
1363
1376
Err ( e) => {
1364
1377
match e {
1365
- // Note that to avoid recursion we never call
1378
+ // Note that to avoid re-entrancy we never call
1366
1379
// `do_attempt_write_data` from here, causing
1367
1380
// the messages enqueued here to not actually
1368
1381
// be sent before the peer is disconnected.
@@ -2064,32 +2077,48 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2064
2077
log_pubkey!( node_id) , msg. contents. short_channel_id) ;
2065
2078
self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2066
2079
} ,
2067
- MessageSendEvent :: HandleError { ref node_id, ref action } => {
2068
- match * action {
2069
- msgs:: ErrorAction :: DisconnectPeer { ref msg } => {
2080
+ MessageSendEvent :: HandleError { node_id, action } => {
2081
+ match action {
2082
+ msgs:: ErrorAction :: DisconnectPeer { msg } => {
2083
+ if let Some ( msg) = msg. as_ref ( ) {
2084
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2085
+ log_pubkey!( node_id) , msg. data) ;
2086
+ } else {
2087
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {}" ,
2088
+ log_pubkey!( node_id) ) ;
2089
+ }
2090
+ // We do not have the peers write lock, so we just store that we're
2091
+ // about to disconenct the peer and do it after we finish
2092
+ // processing most messages.
2093
+ let msg = msg. map ( |msg| wire:: Message :: < <<CMH as core:: ops:: Deref >:: Target as wire:: CustomMessageReader >:: CustomMessage > :: Error ( msg) ) ;
2094
+ peers_to_disconnect. insert ( node_id, msg) ;
2095
+ } ,
2096
+ msgs:: ErrorAction :: DisconnectPeerWithWarning { msg } => {
2097
+ log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2098
+ log_pubkey!( node_id) , msg. data) ;
2070
2099
// We do not have the peers write lock, so we just store that we're
2071
2100
// about to disconenct the peer and do it after we finish
2072
2101
// processing most messages.
2073
- peers_to_disconnect. insert ( * node_id, msg . clone ( ) ) ;
2102
+ peers_to_disconnect. insert ( node_id, Some ( wire :: Message :: Warning ( msg ) ) ) ;
2074
2103
} ,
2075
2104
msgs:: ErrorAction :: IgnoreAndLog ( level) => {
2076
2105
log_given_level ! ( self . logger, level, "Received a HandleError event to be ignored for node {}" , log_pubkey!( node_id) ) ;
2077
2106
} ,
2078
2107
msgs:: ErrorAction :: IgnoreDuplicateGossip => { } ,
2079
2108
msgs:: ErrorAction :: IgnoreError => {
2080
- log_debug ! ( self . logger, "Received a HandleError event to be ignored for node {}" , log_pubkey!( node_id) ) ;
2081
- } ,
2109
+ log_debug ! ( self . logger, "Received a HandleError event to be ignored for node {}" , log_pubkey!( node_id) ) ;
2110
+ } ,
2082
2111
msgs:: ErrorAction :: SendErrorMessage { ref msg } => {
2083
2112
log_trace ! ( self . logger, "Handling SendErrorMessage HandleError event in peer_handler for node {} with message {}" ,
2084
2113
log_pubkey!( node_id) ,
2085
2114
msg. data) ;
2086
- self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2115
+ self . enqueue_message ( & mut * get_peer_for_forwarding ! ( & node_id) , msg) ;
2087
2116
} ,
2088
2117
msgs:: ErrorAction :: SendWarningMessage { ref msg, ref log_level } => {
2089
2118
log_given_level ! ( self . logger, * log_level, "Handling SendWarningMessage HandleError event in peer_handler for node {} with message {}" ,
2090
2119
log_pubkey!( node_id) ,
2091
2120
msg. data) ;
2092
- self . enqueue_message ( & mut * get_peer_for_forwarding ! ( node_id) , msg) ;
2121
+ self . enqueue_message ( & mut * get_peer_for_forwarding ! ( & node_id) , msg) ;
2093
2122
} ,
2094
2123
}
2095
2124
} ,
@@ -2139,9 +2168,6 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
2139
2168
if let Some ( peer_mutex) = peers. remove ( & descriptor) {
2140
2169
let mut peer = peer_mutex. lock ( ) . unwrap ( ) ;
2141
2170
if let Some ( msg) = msg {
2142
- log_trace ! ( self . logger, "Handling DisconnectPeer HandleError event in peer_handler for node {} with message {}" ,
2143
- log_pubkey!( node_id) ,
2144
- msg. data) ;
2145
2171
self . enqueue_message ( & mut * peer, & msg) ;
2146
2172
// This isn't guaranteed to work, but if there is enough free
2147
2173
// room in the send buffer, put the error message there...
0 commit comments