diff --git a/src/main/java/net/minestom/server/MinecraftServer.java b/src/main/java/net/minestom/server/MinecraftServer.java index 22b3ebd28..236d96d9f 100644 --- a/src/main/java/net/minestom/server/MinecraftServer.java +++ b/src/main/java/net/minestom/server/MinecraftServer.java @@ -247,7 +247,7 @@ public final class MinecraftServer { } /** - * Gets the max number of packets a client can send over 1 second. + * Gets the maximum number of packets a client can send over 1 second. * * @return the packet count limit over 1 second, 0 if not enabled */ diff --git a/src/main/java/net/minestom/server/data/SerializableData.java b/src/main/java/net/minestom/server/data/SerializableData.java index 5021beb1e..fd337b757 100644 --- a/src/main/java/net/minestom/server/data/SerializableData.java +++ b/src/main/java/net/minestom/server/data/SerializableData.java @@ -109,7 +109,7 @@ public interface SerializableData extends Data { { final int dataIndexSize = binaryReader.readVarInt(); for (int i = 0; i < dataIndexSize; i++) { - final String className = binaryReader.readSizedString(); + final String className = binaryReader.readSizedString(Short.MAX_VALUE); final short classIndex = binaryReader.readShort(); typeToIndexMap.put(className, classIndex); } diff --git a/src/main/java/net/minestom/server/data/SerializableDataImpl.java b/src/main/java/net/minestom/server/data/SerializableDataImpl.java index 959236494..e2f241436 100644 --- a/src/main/java/net/minestom/server/data/SerializableDataImpl.java +++ b/src/main/java/net/minestom/server/data/SerializableDataImpl.java @@ -149,7 +149,7 @@ public class SerializableDataImpl extends DataImpl implements SerializableData { } // Get the key - final String name = reader.readSizedString(); + final String name = reader.readSizedString(Integer.MAX_VALUE); // Get the data final Object value; diff --git a/src/main/java/net/minestom/server/data/type/InventoryData.java b/src/main/java/net/minestom/server/data/type/InventoryData.java index 78e05ebfb..cb3a95c70 100644 --- a/src/main/java/net/minestom/server/data/type/InventoryData.java +++ b/src/main/java/net/minestom/server/data/type/InventoryData.java @@ -27,8 +27,8 @@ public class InventoryData extends DataType { @NotNull @Override public Inventory decode(@NotNull BinaryReader reader) { - final String title = reader.readSizedString(); - final InventoryType inventoryType = InventoryType.valueOf(reader.readSizedString()); + final String title = reader.readSizedString(Integer.MAX_VALUE); + final InventoryType inventoryType = InventoryType.valueOf(reader.readSizedString(Integer.MAX_VALUE)); final int size = inventoryType.getAdditionalSlot(); Inventory inventory = new Inventory(inventoryType, title); diff --git a/src/main/java/net/minestom/server/data/type/StringData.java b/src/main/java/net/minestom/server/data/type/StringData.java index 99d0a3a5f..9b8387543 100644 --- a/src/main/java/net/minestom/server/data/type/StringData.java +++ b/src/main/java/net/minestom/server/data/type/StringData.java @@ -15,6 +15,6 @@ public class StringData extends DataType { @NotNull @Override public String decode(@NotNull BinaryReader reader) { - return reader.readSizedString(); + return reader.readSizedString(Integer.MAX_VALUE); } } diff --git a/src/main/java/net/minestom/server/data/type/array/StringArrayData.java b/src/main/java/net/minestom/server/data/type/array/StringArrayData.java index cbdde7ab1..514fc4a0b 100644 --- a/src/main/java/net/minestom/server/data/type/array/StringArrayData.java +++ b/src/main/java/net/minestom/server/data/type/array/StringArrayData.java @@ -9,19 +9,12 @@ public class StringArrayData extends DataType { @Override public void encode(@NotNull BinaryWriter writer, @NotNull String[] value) { - writer.writeVarInt(value.length); - for (String val : value) { - writer.writeSizedString(val); - } + writer.writeStringArray(value); } @NotNull @Override public String[] decode(@NotNull BinaryReader reader) { - String[] array = new String[reader.readVarInt()]; - for (int i = 0; i < array.length; i++) { - array[i] = reader.readSizedString(); - } - return array; + return reader.readSizedStringArray(Integer.MAX_VALUE); } } diff --git a/src/main/java/net/minestom/server/extras/velocity/VelocityProxy.java b/src/main/java/net/minestom/server/extras/velocity/VelocityProxy.java index daeb72f07..8b8e66838 100644 --- a/src/main/java/net/minestom/server/extras/velocity/VelocityProxy.java +++ b/src/main/java/net/minestom/server/extras/velocity/VelocityProxy.java @@ -72,7 +72,7 @@ public final class VelocityProxy { } public static InetAddress readAddress(@NotNull BinaryReader reader) { - return InetAddresses.forString(reader.readSizedString()); + return InetAddresses.forString(reader.readSizedString(Integer.MAX_VALUE)); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java index 8ccff15cd..8041c4df3 100644 --- a/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/handshake/HandshakePacket.java @@ -31,7 +31,7 @@ public class HandshakePacket implements ClientPreplayPacket { @Override public void read(@NotNull BinaryReader reader) { this.protocolVersion = reader.readVarInt(); - this.serverAddress = reader.readSizedString(); + this.serverAddress = reader.readSizedString(256); this.serverPort = reader.readUnsignedShort(); this.nextState = reader.readVarInt(); } diff --git a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java index 52c150317..5a088174c 100644 --- a/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/login/LoginStartPacket.java @@ -88,7 +88,7 @@ public class LoginStartPacket implements ClientPreplayPacket { @Override public void read(@NotNull BinaryReader reader) { - this.username = reader.readSizedString(); + this.username = reader.readSizedString(16); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java index 578e6d1e0..da0d9e075 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientAdvancementTabPacket.java @@ -15,7 +15,7 @@ public class ClientAdvancementTabPacket extends ClientPlayPacket { this.action = AdvancementAction.values()[reader.readVarInt()]; if (action == AdvancementAction.OPENED_TAB) { - this.tabIdentifier = reader.readSizedString(); + this.tabIdentifier = reader.readSizedString(256); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java index f46edaa67..c0ee121d8 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientChatMessagePacket.java @@ -10,6 +10,6 @@ public class ClientChatMessagePacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { - this.message = reader.readSizedString(); + this.message = reader.readSizedString(256); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java index 2fbb7d45e..29b0bad11 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientCraftRecipeRequest.java @@ -13,7 +13,7 @@ public class ClientCraftRecipeRequest extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { this.windowId = reader.readByte(); - this.recipe = reader.readSizedString(); + this.recipe = reader.readSizedString(256); this.makeAll = reader.readBoolean(); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java index e94fc69cd..c6b471463 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientNameItemPacket.java @@ -10,6 +10,6 @@ public class ClientNameItemPacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { - this.itemName = reader.readSizedString(); + this.itemName = reader.readSizedString(Short.MAX_VALUE); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java index 4226e4bda..1ec68ea32 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientPluginMessagePacket.java @@ -11,7 +11,7 @@ public class ClientPluginMessagePacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { - this.channel = reader.readSizedString(); + this.channel = reader.readSizedString(256); this.data = reader.getRemainingBytes(); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientRecipeBookData.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientRecipeBookData.java index 1b5d0d515..db70c2820 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientRecipeBookData.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientRecipeBookData.java @@ -25,7 +25,7 @@ public class ClientRecipeBookData extends ClientPlayPacket { switch (type) { case 0: - this.recipeId = reader.readSizedString(); + this.recipeId = reader.readSizedString(256); break; case 1: this.craftingRecipeBookOpen = reader.readBoolean(); diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java index 0261a9e3d..341f9a06d 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientSettingsPacket.java @@ -16,7 +16,7 @@ public class ClientSettingsPacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { - this.locale = reader.readSizedString(); + this.locale = reader.readSizedString(128); this.viewDistance = reader.readByte(); this.chatMode = Player.ChatMode.values()[reader.readVarInt()]; this.chatColors = reader.readBoolean(); diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java index 63ed76e2d..43a7ade17 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientTabCompletePacket.java @@ -12,6 +12,6 @@ public class ClientTabCompletePacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { this.transactionId = reader.readVarInt(); - this.text = reader.readSizedString(); + this.text = reader.readSizedString(Short.MAX_VALUE); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java index bab3daaeb..840509828 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockMinecartPacket.java @@ -13,7 +13,7 @@ public class ClientUpdateCommandBlockMinecartPacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { this.entityId = reader.readVarInt(); - this.command = reader.readSizedString(); + this.command = reader.readSizedString(Short.MAX_VALUE); this.trackOutput = reader.readBoolean(); } } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java index 8ed900824..1741ccd7b 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateCommandBlockPacket.java @@ -15,7 +15,7 @@ public class ClientUpdateCommandBlockPacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { this.blockPosition = reader.readBlockPosition(); - this.command = reader.readSizedString(); + this.command = reader.readSizedString(Short.MAX_VALUE); this.mode = Mode.values()[reader.readVarInt()]; this.flags = reader.readByte(); } diff --git a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java index 972b4d6b0..61610c2dd 100644 --- a/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java +++ b/src/main/java/net/minestom/server/network/packet/client/play/ClientUpdateSignPacket.java @@ -16,10 +16,10 @@ public class ClientUpdateSignPacket extends ClientPlayPacket { @Override public void read(@NotNull BinaryReader reader) { this.blockPosition = reader.readBlockPosition(); - this.line1 = reader.readSizedString(); - this.line2 = reader.readSizedString(); - this.line3 = reader.readSizedString(); - this.line4 = reader.readSizedString(); + this.line1 = reader.readSizedString(384); + this.line2 = reader.readSizedString(384); + this.line3 = reader.readSizedString(384); + this.line4 = reader.readSizedString(384); } } diff --git a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java index 84a367bbc..a35e4a9c0 100644 --- a/src/main/java/net/minestom/server/utils/binary/BinaryReader.java +++ b/src/main/java/net/minestom/server/utils/binary/BinaryReader.java @@ -10,6 +10,7 @@ import net.minestom.server.utils.BlockPosition; import net.minestom.server.utils.NBTUtils; import net.minestom.server.utils.SerializerUtils; import net.minestom.server.utils.Utils; +import net.minestom.server.utils.validate.Check; import org.jglrxavpok.hephaistos.nbt.NBT; import org.jglrxavpok.hephaistos.nbt.NBTException; import org.jglrxavpok.hephaistos.nbt.NBTReader; @@ -76,8 +77,21 @@ public class BinaryReader extends InputStream { return buffer.readDouble(); } - public String readSizedString() { + /** + * Reads a string size by a var-int. + *

+ * If the string length is higher than {@code maxLength}, + * the code throws an exception and the string bytes are not read. + * + * @param maxLength the max length of the string + * @return the string + * @throws IllegalStateException if the string length is higher than {@code maxLength} + */ + public String readSizedString(int maxLength) { final int length = readVarInt(); + Check.stateCondition(length >= maxLength, + "String length (" + length + ") was higher than the max length of " + maxLength); + final byte[] bytes = readBytes(length); return new String(bytes); } @@ -96,11 +110,11 @@ public class BinaryReader extends InputStream { return bytes; } - public String[] readSizedStringArray() { + public String[] readSizedStringArray(int maxLength) { final int size = readVarInt(); String[] strings = new String[size]; for (int i = 0; i < size; i++) { - strings[i] = readSizedString(); + strings[i] = readSizedString(maxLength); } return strings; } @@ -133,8 +147,8 @@ public class BinaryReader extends InputStream { return NBTUtils.readItemStack(this); } - public JsonMessage readJsonMessage() { - final String string = readSizedString(); + public JsonMessage readJsonMessage(int maxLength) { + final String string = readSizedString(maxLength); final JsonObject jsonObject = JsonParser.parseString(string).getAsJsonObject(); return new JsonMessage.RawJsonMessage(jsonObject); }