From 38d839bff7bf9fd0cd30fbd828b1dc62e3b74222 Mon Sep 17 00:00:00 2001 From: "Alex \"mcmonkey\" Goodwin" Date: Thu, 2 Dec 2021 08:43:14 -0800 Subject: [PATCH] bungee: smarter packet-in string handling --- .../bukkit/bungee/BungeeClientHandler.java | 6 ++++++ .../depenizen/bukkit/bungee/PacketIn.java | 15 +++++++++++--- .../bungee/packets/in/AddServerPacketIn.java | 10 ++-------- .../bungee/packets/in/PlayerQuitPacketIn.java | 6 ++---- .../in/PlayerSwitchServerPacketIn.java | 13 +++--------- .../packets/in/ProxyCommandPacketIn.java | 20 ++++--------------- .../bungee/packets/in/ProxyPingPacketIn.java | 20 ++++--------------- .../bungee/packets/in/ReadTagPacketIn.java | 20 ++++--------------- .../packets/in/RemoveServerPacketIn.java | 6 ++---- .../packets/in/RunCommandsPacketIn.java | 13 +++--------- .../bungee/packets/in/RunScriptPacketIn.java | 13 +++--------- .../packets/in/TagResponsePacketIn.java | 6 ++---- .../bungee/packets/in/YourInfoPacketIn.java | 10 ++-------- 13 files changed, 49 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/BungeeClientHandler.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/BungeeClientHandler.java index f078573b0..7bf2adede 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/BungeeClientHandler.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/BungeeClientHandler.java @@ -27,7 +27,13 @@ public class BungeeClientHandler extends ChannelInboundHandlerAdapter { public ByteBuf packetBuffer; + public boolean hasClosed = false; + public void fail(String reason) { + if (hasClosed) { + return; + } + hasClosed = true; Debug.echoError("Depenizen-Bungee connection failed: " + reason); channel.close(); BungeeBridge.instance.connected = false; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/PacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/PacketIn.java index 036fae91c..cd343f37b 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/PacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/PacketIn.java @@ -9,9 +9,18 @@ public abstract class PacketIn { public abstract void process(ByteBuf data); - public String readString(ByteBuf buf, int length) { - byte[] strBytes = new byte[length]; - buf.readBytes(strBytes, 0, length); + public String readString(ByteBuf buf, String label) { + if (buf.readableBytes() < 4) { + BungeeBridge.instance.handler.fail("Invalid " + getName() + " Packet " + label + " length bytes (needed 4)"); + return null; + } + int len = buf.readInt(); + if (buf.readableBytes() < len || len < 0) { + BungeeBridge.instance.handler.fail("Invalid " + getName() + " Packet " + label + " (bytes requested: " + len + ", bytes available: " + buf.readableBytes() + ")"); + return null; + } + byte[] strBytes = new byte[len]; + buf.readBytes(strBytes, 0, len); return new String(strBytes, Charsets.UTF_8); } } diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/AddServerPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/AddServerPacketIn.java index a20033230..aecf32f6f 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/AddServerPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/AddServerPacketIn.java @@ -16,16 +16,10 @@ public String getName() { @Override public void process(ByteBuf data) { - if (data.readableBytes() < 4) { - BungeeBridge.instance.handler.fail("Invalid AddServerPacket (bytes available: " + data.readableBytes() + ")"); + String serverName = readString(data, "serverName"); + if (serverName == null) { return; } - int yourNameLength = data.readInt(); - if (data.readableBytes() < yourNameLength || yourNameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid AddServerPacket (name bytes requested: " + yourNameLength + ")"); - return; - } - String serverName = readString(data, yourNameLength); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeeBridge.instance.knownServers.add(serverName); BungeeServerConnectScriptEvent.instance.serverName = serverName; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerQuitPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerQuitPacketIn.java index 9d469b2f8..650c9ce33 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerQuitPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerQuitPacketIn.java @@ -25,12 +25,10 @@ public void process(ByteBuf data) { long mostSigBits = data.readLong(); long leastSigBits = data.readLong(); UUID uuid = new UUID(mostSigBits, leastSigBits); - int nameLength = data.readInt(); - if (data.readableBytes() < nameLength || nameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid PlayerQuitPacket (name bytes requested: " + nameLength + ")"); + String name = readString(data, "name"); + if (name == null) { return; } - String name = readString(data, nameLength); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeePlayerQuitsScriptEvent.instance.name = name; BungeePlayerQuitsScriptEvent.instance.uuid = uuid; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerSwitchServerPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerSwitchServerPacketIn.java index c49d346be..fb96e4aeb 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerSwitchServerPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/PlayerSwitchServerPacketIn.java @@ -25,18 +25,11 @@ public void process(ByteBuf data) { long mostSigBits = data.readLong(); long leastSigBits = data.readLong(); UUID uuid = new UUID(mostSigBits, leastSigBits); - int nameLength = data.readInt(); - if (data.readableBytes() < nameLength || nameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + nameLength + ")"); + String name = readString(data, "name"); + String serverName = readString(data, "serverName"); + if (name == null || serverName == null) { return; } - String name = readString(data, nameLength); - int serverNameLength = data.readInt(); - if (data.readableBytes() < serverNameLength || serverNameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid PlayerSwitchServerPacket (name bytes requested: " + serverNameLength + ")"); - return; - } - String serverName = readString(data, serverNameLength); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeePlayerServerSwitchScriptEvent.instance.name = name; BungeePlayerServerSwitchScriptEvent.instance.uuid = uuid; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyCommandPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyCommandPacketIn.java index 8ee115274..5f62ebe7a 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyCommandPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyCommandPacketIn.java @@ -24,24 +24,12 @@ public void process(ByteBuf data) { return; } long id = data.readLong(); - int senderLength = data.readInt(); - if (data.readableBytes() < senderLength || senderLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (sender bytes requested: " + senderLength + ")"); + String sender = readString(data, "sender"); + String command = readString(data, "command"); + String senderIdText = readString(data, "senderID"); + if (sender == null || command == null || senderIdText == null) { return; } - String sender = readString(data, senderLength); - int commandLength = data.readInt(); - if (data.readableBytes() < commandLength || commandLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (command bytes requested: " + commandLength + ")"); - return; - } - String command = readString(data, commandLength); - int senderIdLength = data.readInt(); - if (data.readableBytes() < senderIdLength || senderIdLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyCommandPacket (senderId bytes requested: " + senderIdLength + ")"); - return; - } - String senderIdText = readString(data, senderIdLength); UUID senderId = senderIdText.isEmpty() ? null : UUID.fromString(senderIdText); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeeProxyServerCommandScriptEvent.instance.sender = sender; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyPingPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyPingPacketIn.java index 41778cf5a..c2ea04b45 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyPingPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ProxyPingPacketIn.java @@ -22,27 +22,15 @@ public void process(ByteBuf data) { return; } long id = data.readLong(); - int addressLength = data.readInt(); - if (data.readableBytes() < addressLength || addressLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (address bytes requested: " + addressLength + ")"); - return; - } - String address = readString(data, addressLength); + String address = readString(data, "address"); int currentPlayers = data.readInt(); int maxPlayers = data.readInt(); - int motdLength = data.readInt(); - if (data.readableBytes() < motdLength || motdLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (motd bytes requested: " + motdLength + ")"); - return; - } - String motd = readString(data, motdLength); + String motd = readString(data, "motd"); int protocol = data.readInt(); - int versionLength = data.readInt(); - if (data.readableBytes() < versionLength || versionLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ProxyPingPacket (version bytes requested: " + versionLength + ")"); + String version = readString(data, "version"); + if (address == null || motd == null || version == null) { return; } - String version = readString(data, versionLength); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeeProxyServerListPingScriptEvent.PingData ping = new BungeeProxyServerListPingScriptEvent.PingData(); ping.address = address; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ReadTagPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ReadTagPacketIn.java index 434d06dae..e66276471 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ReadTagPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/ReadTagPacketIn.java @@ -30,24 +30,12 @@ public void process(ByteBuf data) { BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (bytes available: " + data.readableBytes() + ")"); return; } - int nameLength = data.readInt(); - if (data.readableBytes() < nameLength || nameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (name bytes requested: " + nameLength + ")"); + String responseServer = readString(data, "serverName"); + String tag = readString(data, "tag"); + String defs = readString(data, "defs"); + if (tag == null || defs == null) { return; } - String responseServer = readString(data, nameLength); - int tagLength = data.readInt(); - if (data.readableBytes() < tagLength || tagLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (tag bytes requested: " + tagLength + ")"); - return; - } - String tag = readString(data, tagLength); - int defLength = data.readInt(); - if (data.readableBytes() < defLength || defLength < 0) { - BungeeBridge.instance.handler.fail("Invalid ReadTagPacket (def bytes requested: " + defLength + ")"); - return; - } - String defs = readString(data, defLength); long uuidMost = data.readLong(); long uuidLeast = data.readLong(); int responseId = data.readInt(); diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RemoveServerPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RemoveServerPacketIn.java index 71538e641..e3922b026 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RemoveServerPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RemoveServerPacketIn.java @@ -20,12 +20,10 @@ public void process(ByteBuf data) { BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (bytes available: " + data.readableBytes() + ")"); return; } - int serverNameLength = data.readInt(); - if (data.readableBytes() < serverNameLength || serverNameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid RemoveServerPacket (name bytes requested: " + serverNameLength + ")"); + String serverName = readString(data, "serverName"); + if (serverName == null) { return; } - String serverName = readString(data, serverNameLength); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { BungeeBridge.instance.knownServers.remove(serverName); BungeeServerDisconnectScriptEvent.instance.serverName = serverName; diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunCommandsPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunCommandsPacketIn.java index 9717f00cb..7c31ebc6c 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunCommandsPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunCommandsPacketIn.java @@ -30,18 +30,11 @@ public void process(ByteBuf data) { BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (bytes available: " + data.readableBytes() + ")"); return; } - int commamndsLength = data.readInt(); - if (data.readableBytes() < commamndsLength || commamndsLength < 0) { - BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (command bytes requested: " + commamndsLength + ")"); + String commands = readString(data, "commands"); + String defs = readString(data, "defs"); + if (commands == null || defs == null) { return; } - String commands = readString(data, commamndsLength); - int defsLength = data.readInt(); - if (data.readableBytes() < defsLength || defsLength < 0) { - BungeeBridge.instance.handler.fail("Invalid RunCommandsPacket (def bytes requested: " + defsLength + ")"); - return; - } - String defs = readString(data, defsLength); boolean shouldDebug = data.readByte() != 0; long uuidMost = data.readLong(); long uuidLeast = data.readLong(); diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunScriptPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunScriptPacketIn.java index 0471a250d..6ccba74f6 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunScriptPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/RunScriptPacketIn.java @@ -34,18 +34,11 @@ public void process(ByteBuf data) { BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (bytes available: " + data.readableBytes() + ")"); return; } - int nameLength = data.readInt(); - if (data.readableBytes() < nameLength || nameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (name bytes requested: " + nameLength + ")"); + String scriptName = readString(data, "scriptName"); + String defs = readString(data, "defs"); + if (scriptName == null || defs == null) { return; } - String scriptName = readString(data, nameLength); - int defsLength = data.readInt(); - if (data.readableBytes() < defsLength || defsLength < 0) { - BungeeBridge.instance.handler.fail("Invalid RunScriptPacket (def bytes requested: " + defsLength + ")"); - return; - } - String defs = readString(data, defsLength); long uuidMost = data.readLong(); long uuidLeast = data.readLong(); Bukkit.getScheduler().scheduleSyncDelayedTask(Depenizen.instance, () -> { diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/TagResponsePacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/TagResponsePacketIn.java index 46795e47e..dce5fcea9 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/TagResponsePacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/TagResponsePacketIn.java @@ -18,12 +18,10 @@ public void process(ByteBuf data) { BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (bytes available: " + data.readableBytes() + ")"); return; } - int resLength = data.readInt(); - if (data.readableBytes() < resLength || resLength < 0) { - BungeeBridge.instance.handler.fail("Invalid TagResponsePacket (result bytes requested: " + resLength + ")"); + String result = readString(data, "result"); + if (result == null) { return; } - String result = readString(data, resLength); int id = data.readInt(); BungeeTagCommand.handleResult(id, result); } diff --git a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/YourInfoPacketIn.java b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/YourInfoPacketIn.java index bd1625033..34e2abc9a 100644 --- a/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/YourInfoPacketIn.java +++ b/src/main/java/com/denizenscript/depenizen/bukkit/bungee/packets/in/YourInfoPacketIn.java @@ -13,16 +13,10 @@ public String getName() { @Override public void process(ByteBuf data) { - if (data.readableBytes() < 4) { - BungeeBridge.instance.handler.fail("Invalid YourInfoPacket (bytes available: " + data.readableBytes() + ")"); + String serverName = readString(data, "serverName"); + if (serverName == null) { return; } - int yourNameLength = data.readInt(); - if (data.readableBytes() < yourNameLength || yourNameLength < 0) { - BungeeBridge.instance.handler.fail("Invalid YourInfoPacket (name bytes requested: " + yourNameLength + ")"); - return; - } - String serverName = readString(data, yourNameLength); BungeeBridge.instance.serverName = serverName; } }