Skip to content

Commit 886f490

Browse files
committed
Fix race condition in NioPeerHandler on socket_disconnected
1 parent adf0d2f commit 886f490

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/main/java/org/ldk/batteries/NioPeerHandler.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,11 @@ public NioPeerHandler(PeerManager manager) throws IOException {
174174
if (chan == null) continue;
175175
try {
176176
Peer peer = setup_socket(chan);
177+
peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer);
177178
Result_NonePeerHandleErrorZ res = this.peer_manager.new_inbound_connection(peer.descriptor);
178-
if (res instanceof Result_NonePeerHandleErrorZ.Result_NonePeerHandleErrorZ_OK) {
179-
peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer);
180-
}
179+
if (res instanceof Result_NonePeerHandleErrorZ.Result_NonePeerHandleErrorZ_Err) {
180+
peer.descriptor.disconnect_socket();
181+
}
181182
} catch (IOException ignored) { }
182183
}
183184
continue; // There is no attachment so the rest of the loop is useless
@@ -273,14 +274,17 @@ public void connect(byte[] their_node_id, SocketAddress remote, int timeout_ms)
273274
throw new IOException("Timed out");
274275
}
275276
Peer peer = setup_socket(chan);
277+
do_selector_action(() -> peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer));
276278
Result_CVec_u8ZPeerHandleErrorZ res = this.peer_manager.new_outbound_connection(their_node_id, peer.descriptor);
277279
if (res instanceof Result_CVec_u8ZPeerHandleErrorZ.Result_CVec_u8ZPeerHandleErrorZ_OK) {
278280
byte[] initial_bytes = ((Result_CVec_u8ZPeerHandleErrorZ.Result_CVec_u8ZPeerHandleErrorZ_OK) res).res;
279281
if (chan.write(ByteBuffer.wrap(initial_bytes)) != initial_bytes.length) {
282+
peer.descriptor.disconnect_socket();
283+
this.peer_manager.socket_disconnected(peer.descriptor);
280284
throw new IOException("We assume TCP socket buffer is at least a single packet in length");
281285
}
282-
do_selector_action(() -> peer.key = chan.register(this.selector, SelectionKey.OP_READ, peer));
283286
} else {
287+
peer.descriptor.disconnect_socket();
284288
throw new IOException("LDK rejected outbound connection. This likely shouldn't ever happen.");
285289
}
286290
}

0 commit comments

Comments
 (0)