aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0293-Handle-Large-Packets-disconnecting-client.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0293-Handle-Large-Packets-disconnecting-client.patch')
-rw-r--r--patches/server/0293-Handle-Large-Packets-disconnecting-client.patch115
1 files changed, 115 insertions, 0 deletions
diff --git a/patches/server/0293-Handle-Large-Packets-disconnecting-client.patch b/patches/server/0293-Handle-Large-Packets-disconnecting-client.patch
new file mode 100644
index 0000000000..49ba10fe12
--- /dev/null
+++ b/patches/server/0293-Handle-Large-Packets-disconnecting-client.patch
@@ -0,0 +1,115 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Aikar <[email protected]>
+Date: Tue, 27 Nov 2018 21:18:06 -0500
+Subject: [PATCH] Handle Large Packets disconnecting client
+
+If a players inventory is too big to send in a single packet,
+split the inventory set into multiple packets instead.
+
+diff --git a/src/main/java/net/minecraft/network/Connection.java b/src/main/java/net/minecraft/network/Connection.java
+index 2643c3d99c11bc6783386502c7e21293b6dfa345..07fd527dd5b72ecc66311c1b81e578158e12a35c 100644
+--- a/src/main/java/net/minecraft/network/Connection.java
++++ b/src/main/java/net/minecraft/network/Connection.java
+@@ -126,6 +126,15 @@ public class Connection extends SimpleChannelInboundHandler<Packet<?>> {
+ }
+
+ public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) {
++ // Paper start
++ if (throwable instanceof io.netty.handler.codec.EncoderException && throwable.getCause() instanceof PacketEncoder.PacketTooLargeException) {
++ if (((PacketEncoder.PacketTooLargeException) throwable.getCause()).getPacket().packetTooLarge(this)) {
++ return;
++ } else {
++ throwable = throwable.getCause();
++ }
++ }
++ // Paper end
+ if (throwable instanceof SkipPacketException) {
+ Connection.LOGGER.debug("Skipping packet due to errors", throwable.getCause());
+ } else {
+diff --git a/src/main/java/net/minecraft/network/PacketEncoder.java b/src/main/java/net/minecraft/network/PacketEncoder.java
+index 00d432bd395e7f7fb6ee24e371818d13892b2f0c..5fce1177e7198d791d4ab1c64b394c5b1c145782 100644
+--- a/src/main/java/net/minecraft/network/PacketEncoder.java
++++ b/src/main/java/net/minecraft/network/PacketEncoder.java
+@@ -54,7 +54,31 @@ public class PacketEncoder extends MessageToByteEncoder<Packet<?>> {
+ throw var10;
+ }
+ }
++
++ // Paper start
++ int packetLength = friendlyByteBuf.readableBytes();
++ if (packetLength > MAX_PACKET_SIZE) {
++ throw new PacketTooLargeException(packet, packetLength);
++ }
++ // Paper end
+ }
+ }
+ }
++
++ // Paper start
++ private static int MAX_PACKET_SIZE = 2097152;
++
++ public static class PacketTooLargeException extends RuntimeException {
++ private final Packet<?> packet;
++
++ PacketTooLargeException(Packet<?> packet, int packetLength) {
++ super("PacketTooLarge - " + packet.getClass().getSimpleName() + " is " + packetLength + ". Max is " + MAX_PACKET_SIZE);
++ this.packet = packet;
++ }
++
++ public Packet<?> getPacket() {
++ return packet;
++ }
++ }
++ // Paper end
+ }
+diff --git a/src/main/java/net/minecraft/network/protocol/Packet.java b/src/main/java/net/minecraft/network/protocol/Packet.java
+index 10c1f2d8a92f848c3f2be9d1d06fd254978e6dcc..74bfe0d3942259c45702b099efdc4e101a4e3022 100644
+--- a/src/main/java/net/minecraft/network/protocol/Packet.java
++++ b/src/main/java/net/minecraft/network/protocol/Packet.java
+@@ -8,6 +8,12 @@ public interface Packet<T extends PacketListener> {
+
+ void handle(T listener);
+
++ // Paper start
++ default boolean packetTooLarge(net.minecraft.network.Connection manager) {
++ return false;
++ }
++ // Paper end
++
+ default boolean isSkippable() {
+ return false;
+ }
+diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundContainerSetContentPacket.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundContainerSetContentPacket.java
+index 0e076173033278587df2b5dfbd01cc9005651eb5..dbd8b9b09b82c1b75e8be9dc7416d9f0863c8c87 100644
+--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundContainerSetContentPacket.java
++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundContainerSetContentPacket.java
+@@ -31,6 +31,16 @@ public class ClientboundContainerSetContentPacket implements Packet<ClientGamePa
+ this.carriedItem = buf.readItem();
+ }
+
++ // Paper start
++ @Override
++ public boolean packetTooLarge(net.minecraft.network.Connection manager) {
++ for (int i = 0 ; i < this.items.size() ; i++) {
++ manager.send(new ClientboundContainerSetSlotPacket(this.containerId, this.stateId, i, this.items.get(i)));
++ }
++ return true;
++ }
++ // Paper end
++
+ @Override
+ public void write(FriendlyByteBuf buf) {
+ buf.writeByte(this.containerId);
+diff --git a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java
+index cc2f53fba1e5f6b6d4d31081ddaca1ace70abf99..fef3507dbaeb963ba4132ab7beb26d22ec39d425 100644
+--- a/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java
++++ b/src/main/java/net/minecraft/network/protocol/game/ClientboundLevelChunkPacketData.java
+@@ -50,7 +50,7 @@ public class ClientboundLevelChunkPacketData {
+ throw new RuntimeException("Can't read heightmap in packet for [" + x + ", " + z + "]");
+ } else {
+ int i = buf.readVarInt();
+- if (i > 2097152) {
++ if (i > 2097152) { // Paper - diff on change - if this changes, update PacketEncoder
+ throw new RuntimeException("Chunk Packet trying to allocate too much memory on read.");
+ } else {
+ this.buffer = new byte[i];