From a7b41f2ea6fcf3ae0cd631bdc7f70ad29c469d0a Mon Sep 17 00:00:00 2001 From: YTKAB0BP Date: Thu, 12 Mar 2026 11:51:52 +0300 Subject: [PATCH 1/2] Fix TCP buffer not flushing without PSH flag --- .../li/cil/oc2/common/inet/StreamSessionImpl.java | 14 +++++++------- .../java/li/cil/oc2/common/inet/TcpHeader.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java b/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java index 1d9e01f5a..8820033a4 100644 --- a/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java +++ b/src/main/java/li/cil/oc2/common/inet/StreamSessionImpl.java @@ -290,13 +290,13 @@ SessionActions send(final StreamSessionImpl session, final ByteBuffer segment) { } } session.vmWindow = header.window; - if (header.psh) { - // Data to be sent - session.vmSequence += length; - final ByteBuffer sendBuffer = session.sendBuffer; - sendBuffer.compact(); - sendBuffer.put(segment); - sendBuffer.flip(); + // Data to be sent + session.vmSequence += length; + final ByteBuffer sendBuffer = session.sendBuffer; + sendBuffer.compact(); + sendBuffer.put(segment); + sendBuffer.flip(); + if (header.psh || length > 0) { session.needsAcknowledgment = true; } if (header.fin) { diff --git a/src/main/java/li/cil/oc2/common/inet/TcpHeader.java b/src/main/java/li/cil/oc2/common/inet/TcpHeader.java index eaf9f997a..0332663a3 100644 --- a/src/main/java/li/cil/oc2/common/inet/TcpHeader.java +++ b/src/main/java/li/cil/oc2/common/inet/TcpHeader.java @@ -120,7 +120,7 @@ public void acceptConnection(final int sequence, final int acknowledgment, final } public boolean isAcceptanceOrRejectionAcknowledged() { - return !syn && !urg && ack && !psh && !rst && !fin; + return !syn && !urg && ack && !rst && !fin; } public void rejectConnection(final int sequence, final int acknowledgment) { From 4e70b639e2bf39f756671d28b548c723b4f4cae4 Mon Sep 17 00:00:00 2001 From: YTKAB0BP Date: Thu, 12 Mar 2026 12:44:58 +0300 Subject: [PATCH 2/2] Fix ConcurrentModificationException in onStop Yeah, it's a bit wasteful to create a copy of sessions, but it's only on stopping of a machine, which properly avoids CME --- .../java/li/cil/oc2/common/inet/DefaultTransportLayer.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java b/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java index 721e72866..961d5f822 100644 --- a/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java +++ b/src/main/java/li/cil/oc2/common/inet/DefaultTransportLayer.java @@ -360,7 +360,9 @@ public Optional onSave() { @Override public void onStop() { - for (final SessionBase session : sessions.values()) { + // Avoid concurrent modifications + final HashMap, SessionBase> clone = new HashMap<>(sessions); + for (final SessionBase session : clone.values()) { session.expire(); sessionLayer.sendSession(session, null); closeSession(session);