aboutsummaryrefslogtreecommitdiffhomepage
path: root/Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch
diff options
context:
space:
mode:
authorAikar <[email protected]>2020-06-28 04:35:41 -0400
committerAikar <[email protected]>2020-06-28 04:35:41 -0400
commitb6925c36afa7565cac8f9fe9d3432fe658ca1f77 (patch)
treed64424c2e64e933af075b26c6888e526d7633b69 /Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch
parent5e9cc3a2281589ee6e0ca736712432ba4a0935cd (diff)
downloadPaper-b6925c36afa7565cac8f9fe9d3432fe658ca1f77.tar.gz
Paper-b6925c36afa7565cac8f9fe9d3432fe658ca1f77.zip
Remove no longer needed undead horse leash patch
This is now default vanilla behavior Fixes #3644
Diffstat (limited to 'Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch')
-rw-r--r--Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch122
1 files changed, 122 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch b/Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch
new file mode 100644
index 0000000000..60c1f1ac66
--- /dev/null
+++ b/Spigot-Server-Patches/0321-Handle-Large-Packets-disconnecting-client.patch
@@ -0,0 +1,122 @@
+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/server/NetworkManager.java b/src/main/java/net/minecraft/server/NetworkManager.java
+index 2916119507ec5ecd9266569b0003d0504a79f6c4..e7b4c7f2d7b0eed4c145f6476f35b637d861551e 100644
+--- a/src/main/java/net/minecraft/server/NetworkManager.java
++++ b/src/main/java/net/minecraft/server/NetworkManager.java
+@@ -12,6 +12,7 @@ import io.netty.channel.epoll.EpollEventLoopGroup;
+ import io.netty.channel.local.LocalChannel;
+ import io.netty.channel.local.LocalServerChannel;
+ import io.netty.channel.nio.NioEventLoopGroup;
++import io.netty.handler.codec.EncoderException; // Paper
+ import io.netty.handler.timeout.TimeoutException;
+ import io.netty.util.AttributeKey;
+ import io.netty.util.concurrent.Future;
+@@ -97,6 +98,15 @@ public class NetworkManager extends SimpleChannelInboundHandler<Packet<?>> {
+ }
+
+ public void exceptionCaught(ChannelHandlerContext channelhandlercontext, Throwable throwable) {
++ // Paper start
++ if (throwable instanceof EncoderException && throwable.getCause() instanceof PacketEncoder.PacketTooLargeException) {
++ if (((PacketEncoder.PacketTooLargeException) throwable.getCause()).getPacket().packetTooLarge(this)) {
++ return;
++ } else {
++ throwable = throwable.getCause();
++ }
++ }
++ // Paper end
+ if (throwable instanceof SkipEncodeException) {
+ NetworkManager.LOGGER.debug("Skipping packet due to errors", throwable.getCause());
+ } else {
+diff --git a/src/main/java/net/minecraft/server/Packet.java b/src/main/java/net/minecraft/server/Packet.java
+index 601d4d0fa2a0b3e90f81aed55a2d3473c66c7875..2d8e6a2f4a0c3c5d74a647d7164b0028781d3bf5 100644
+--- a/src/main/java/net/minecraft/server/Packet.java
++++ b/src/main/java/net/minecraft/server/Packet.java
+@@ -10,6 +10,12 @@ public interface Packet<T extends PacketListener> {
+
+ void a(T t0);
+
++ // Paper start
++ default boolean packetTooLarge(NetworkManager manager) {
++ return false;
++ }
++ // Paper end
++
+ default boolean a() {
+ return false;
+ }
+diff --git a/src/main/java/net/minecraft/server/PacketEncoder.java b/src/main/java/net/minecraft/server/PacketEncoder.java
+index 63c4dbd327beb7b6ab42eb44650d68accd3b0de6..b0cfef52cbb5e23beae528668e4e98cedecf603c 100644
+--- a/src/main/java/net/minecraft/server/PacketEncoder.java
++++ b/src/main/java/net/minecraft/server/PacketEncoder.java
+@@ -49,7 +49,31 @@ public class PacketEncoder extends MessageToByteEncoder<Packet<?>> {
+ throw throwable;
+ }
+ }
++
++ // Paper start
++ int packetLength = bytebuf.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/server/PacketPlayOutMapChunk.java b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
+index 72ff0a1e6428a1776f49c26e1715f5f2428ba242..6e1426127fc5b5ddc205603b8d03b98a046f9741 100644
+--- a/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
++++ b/src/main/java/net/minecraft/server/PacketPlayOutMapChunk.java
+@@ -82,7 +82,7 @@ public class PacketPlayOutMapChunk implements Packet<PacketListenerPlayOut> {
+
+ int i = packetdataserializer.i();
+
+- if (i > 2097152) {
++ if (i > 2097152) { // Paper - if this changes, update PacketEncoder
+ throw new RuntimeException("Chunk Packet trying to allocate too much memory on read.");
+ } else {
+ this.f = new byte[i];
+diff --git a/src/main/java/net/minecraft/server/PacketPlayOutWindowItems.java b/src/main/java/net/minecraft/server/PacketPlayOutWindowItems.java
+index ac42c913246f1aa9425fdf6eca48adf29e917c90..901a5df3f7d3f9ee60485ec1044a05e8aff89ccb 100644
+--- a/src/main/java/net/minecraft/server/PacketPlayOutWindowItems.java
++++ b/src/main/java/net/minecraft/server/PacketPlayOutWindowItems.java
+@@ -9,6 +9,15 @@ public class PacketPlayOutWindowItems implements Packet<PacketListenerPlayOut> {
+ private int a;
+ private List<ItemStack> b;
+
++ //Paper start
++ @Override
++ public boolean packetTooLarge(NetworkManager manager) {
++ for (int i = 0 ; i < this.b.size() ; i++) {
++ manager.sendPacket(new PacketPlayOutSetSlot(this.a, i, this.b.get(i)));
++ }
++ return true;
++ }
++ // Paper end
+ public PacketPlayOutWindowItems() {}
+
+ public PacketPlayOutWindowItems(int i, NonNullList<ItemStack> nonnulllist) {