mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-30 16:19:03 +01:00
e886d8118e
Upstream has released updates that appear to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing
71 lines
3.8 KiB
Diff
71 lines
3.8 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Andrew Steinborn <git@steinborn.me>
|
|
Date: Sun, 5 Jul 2020 22:38:18 -0400
|
|
Subject: [PATCH] Optimize NetworkManager Exception Handling
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/EnumProtocol.java b/src/main/java/net/minecraft/server/EnumProtocol.java
|
|
index 32f5470baa88c3dc80db1bb547e1c982ac90237d..64df649e8d209246cc836793160eb0a1506826f8 100644
|
|
--- a/src/main/java/net/minecraft/server/EnumProtocol.java
|
|
+++ b/src/main/java/net/minecraft/server/EnumProtocol.java
|
|
@@ -129,6 +129,7 @@ public enum EnumProtocol {
|
|
|
|
@Nullable
|
|
public Packet<?> a(int i) {
|
|
+ if (i < 0 || i >= this.b.size()) return null; // Paper
|
|
Supplier<? extends Packet<T>> supplier = (Supplier) this.b.get(i);
|
|
|
|
return supplier != null ? (Packet) supplier.get() : null;
|
|
diff --git a/src/main/java/net/minecraft/server/PacketSplitter.java b/src/main/java/net/minecraft/server/PacketSplitter.java
|
|
index cdaa8be90d16b0e9e2f92a3e2ed120b856feab54..2aaa8770edfd8acc6861c23176e405863858b275 100644
|
|
--- a/src/main/java/net/minecraft/server/PacketSplitter.java
|
|
+++ b/src/main/java/net/minecraft/server/PacketSplitter.java
|
|
@@ -9,11 +9,21 @@ import java.util.List;
|
|
|
|
public class PacketSplitter extends ByteToMessageDecoder {
|
|
|
|
+ private final byte[] lenBuf = new byte[3]; // Paper
|
|
public PacketSplitter() {}
|
|
|
|
protected void decode(ChannelHandlerContext channelhandlercontext, ByteBuf bytebuf, List<Object> list) throws Exception {
|
|
+ // Paper start - if channel is not active just discard the packet
|
|
+ if (!channelhandlercontext.channel().isActive()) {
|
|
+ bytebuf.skipBytes(bytebuf.readableBytes());
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
bytebuf.markReaderIndex();
|
|
- byte[] abyte = new byte[3];
|
|
+ // Paper start - reuse temporary length buffer
|
|
+ byte[] abyte = lenBuf;
|
|
+ java.util.Arrays.fill(abyte, (byte) 0);
|
|
+ // Paper end
|
|
|
|
for (int i = 0; i < abyte.length; ++i) {
|
|
if (!bytebuf.isReadable()) {
|
|
diff --git a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
index 9c810b5aa21ca714ccf355d5648b7612f99b6884..8c7080777b370f97e1291dfedde5b419290f39cc 100644
|
|
--- a/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
+++ b/src/main/java/net/minecraft/server/PlayerConnectionUtils.java
|
|
@@ -22,6 +22,21 @@ public class PlayerConnectionUtils {
|
|
try (Timing ignored = timing.startTiming()) { // Paper - timings
|
|
packet.a(t0);
|
|
} // Paper - timings
|
|
+ // Paper start
|
|
+ catch (Exception e) {
|
|
+ NetworkManager networkmanager = t0.a();
|
|
+ if (networkmanager.getPlayer() != null) {
|
|
+ LOGGER.error("Error whilst processing packet {} for {}[{}]", packet, networkmanager.getPlayer().getName(), networkmanager.getSocketAddress(), e);
|
|
+ } else {
|
|
+ LOGGER.error("Error whilst processing packet {} for connection from {}", packet, networkmanager.getSocketAddress(), e);
|
|
+ }
|
|
+ ChatComponentText error = new ChatComponentText("Packet processing error");
|
|
+ networkmanager.sendPacket(new PacketPlayOutKickDisconnect(error), (future) -> {
|
|
+ networkmanager.close(error);
|
|
+ });
|
|
+ networkmanager.stopReading();
|
|
+ }
|
|
+ // Paper end
|
|
} else {
|
|
PlayerConnectionUtils.LOGGER.debug("Ignoring packet due to disconnection: " + packet);
|
|
}
|