mirror of
https://github.com/PaperMC/Paper.git
synced 2024-12-01 20:50:41 +01:00
74f507f4e3
Upstream has released updates that appears to apply and compile correctly. This update has not been tested by PaperMC and as with ANY update, please do your own testing Bukkit Changes: e461dcfe #555: Item - add getters/setters for owner/thrower CraftBukkit Changes: 055870c4 #758: Item - add getters/setters for owner/thrower
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 eb3269e0ea3ce33d08e9eee3bca7cf434921e991..7ea293f38dedd6066601d94adbe175a31c502e1f 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);
|
|
}
|