From 2ea16717399e1deab0bc02cc81808aa50ecba474 Mon Sep 17 00:00:00 2001 From: Anuken Date: Thu, 1 Jul 2021 10:22:28 -0400 Subject: [PATCH] Fixed #5519 --- core/src/mindustry/net/ArcNetProvider.java | 10 +--------- core/src/mindustry/net/Net.java | 3 ++- desktop/src/mindustry/desktop/steam/SNet.java | 12 +++++++++--- 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/core/src/mindustry/net/ArcNetProvider.java b/core/src/mindustry/net/ArcNetProvider.java index 9cbad476ad..ba8ff4cfa0 100644 --- a/core/src/mindustry/net/ArcNetProvider.java +++ b/core/src/mindustry/net/ArcNetProvider.java @@ -391,15 +391,7 @@ public class ArcNetProvider implements NetProvider{ //no compression, copy over buffer if(compression == 0){ buffer.position(0).limit(length); - if(byteBuffer.hasArray()){ - buffer.put(byteBuffer.array(), byteBuffer.position(), length); - }else{ - byte[] readcopy = new byte[length]; - int pos = byteBuffer.position(); - byteBuffer.get(readcopy); - byteBuffer.position(pos); - buffer.put(readcopy); - } + buffer.put(byteBuffer.array(), byteBuffer.position(), length); buffer.position(0); packet.read(reads.get(), length); //move read packets forward diff --git a/core/src/mindustry/net/Net.java b/core/src/mindustry/net/Net.java index 34fed7fa4b..7247f665ad 100644 --- a/core/src/mindustry/net/Net.java +++ b/core/src/mindustry/net/Net.java @@ -9,6 +9,7 @@ import arc.util.async.*; import mindustry.gen.*; import mindustry.net.Packets.*; import mindustry.net.Streamable.*; +import net.jpountz.lz4.*; import java.io.*; import java.nio.*; @@ -97,7 +98,7 @@ public class Net{ if(e instanceof BufferUnderflowException || e instanceof BufferOverflowException){ error = Core.bundle.get("error.io"); - }else if(error.equals("mismatch") || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){ + }else if(error.equals("mismatch") || e instanceof LZ4Exception || (e instanceof IndexOutOfBoundsException && e.getStackTrace()[0].getClassName().contains("java.nio"))){ error = Core.bundle.get("error.mismatch"); }else if(error.contains("port out of range") || error.contains("invalid argument") || (error.contains("invalid") && error.contains("address")) || Strings.neatError(e).contains("address associated")){ error = Core.bundle.get("error.invalidaddress"); diff --git a/desktop/src/mindustry/desktop/steam/SNet.java b/desktop/src/mindustry/desktop/steam/SNet.java index 8541d12056..30f27ed646 100644 --- a/desktop/src/mindustry/desktop/steam/SNet.java +++ b/desktop/src/mindustry/desktop/steam/SNet.java @@ -31,6 +31,7 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, final PacketSerializer serializer = new PacketSerializer(); final ByteBuffer writeBuffer = ByteBuffer.allocateDirect(16384); final ByteBuffer readBuffer = ByteBuffer.allocateDirect(16384); + final ByteBuffer readCopyBuffer = ByteBuffer.allocate(writeBuffer.capacity()); final CopyOnWriteArrayList connections = new CopyOnWriteArrayList<>(); final IntMap steamConnections = new IntMap<>(); //maps steam ID -> valid net connection @@ -51,10 +52,15 @@ public class SNet implements SteamNetworkingCallback, SteamMatchmakingCallback, public void update(){ while((length = snet.isP2PPacketAvailable(0)) != 0){ try{ - readBuffer.position(0); - snet.readP2PPacket(from, readBuffer, 0); + readBuffer.position(0).limit(readBuffer.capacity()); + //lz4 chokes on direct buffers, so copy the bytes over + int len = snet.readP2PPacket(from, readBuffer, 0); + readBuffer.limit(len); + readCopyBuffer.position(0); + readCopyBuffer.put(readBuffer); + readCopyBuffer.position(0); int fromID = from.getAccountID(); - Object output = serializer.read(readBuffer); + Object output = serializer.read(readCopyBuffer); //it may be theoretically possible for this to be a framework message, if the packet is malicious or corrupted if(!(output instanceof Packet)) return;