mirror of
https://github.com/PaperMC/Paper.git
synced 2024-08-28 15:39:36 +02:00
"It was from a different time before books were as jank as they are now. As time has gone on they've only proven to be worse and worse."
80 lines
4.3 KiB
Diff
80 lines
4.3 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/network/ConnectionProtocol.java b/src/main/java/net/minecraft/network/ConnectionProtocol.java
|
|
index e722cf3a8e816b0c7405e6282591d9fa8d5bfa61..22d1758e52f56b39a2c110f123bdbf80898c4d92 100644
|
|
--- a/src/main/java/net/minecraft/network/ConnectionProtocol.java
|
|
+++ b/src/main/java/net/minecraft/network/ConnectionProtocol.java
|
|
@@ -275,6 +275,7 @@ public enum ConnectionProtocol {
|
|
|
|
@Nullable
|
|
public Packet<?> createPacket(int id, FriendlyByteBuf buf) {
|
|
+ if (id < 0 || id >= this.idToDeserializer.size()) return null; // Paper
|
|
Function<FriendlyByteBuf, ? extends Packet<T>> function = this.idToDeserializer.get(id);
|
|
return function != null ? function.apply(buf) : null;
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/network/Varint21FrameDecoder.java b/src/main/java/net/minecraft/network/Varint21FrameDecoder.java
|
|
index 5356f6484751e4b4740720aecac90bdfe044283b..ed54479b14dcfc736ac90749106557f0ff537550 100644
|
|
--- a/src/main/java/net/minecraft/network/Varint21FrameDecoder.java
|
|
+++ b/src/main/java/net/minecraft/network/Varint21FrameDecoder.java
|
|
@@ -8,9 +8,20 @@ import io.netty.handler.codec.CorruptedFrameException;
|
|
import java.util.List;
|
|
|
|
public class Varint21FrameDecoder extends ByteToMessageDecoder {
|
|
+ private final byte[] lenBuf = new byte[3]; // Paper
|
|
@Override
|
|
protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) {
|
|
+ // Paper start - if channel is not active just discard the packet
|
|
+ if (!channelHandlerContext.channel().isActive()) {
|
|
+ byteBuf.skipBytes(byteBuf.readableBytes());
|
|
+ return;
|
|
+ }
|
|
+ // Paper end
|
|
byteBuf.markReaderIndex();
|
|
+ // Paper start - reuse temporary length buffer
|
|
+ byte[] abyte = lenBuf;
|
|
+ java.util.Arrays.fill(abyte, (byte) 0);
|
|
+ // Paper end
|
|
byte[] bs = new byte[3];
|
|
|
|
for(int i = 0; i < bs.length; ++i) {
|
|
diff --git a/src/main/java/net/minecraft/network/protocol/PacketUtils.java b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
|
index 449f1b2f5dca350dc0912e14c8c2bf3eb4652b92..bcf53ec07b8eeec7a88fb67e6fb908362e6f51b0 100644
|
|
--- a/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
|
+++ b/src/main/java/net/minecraft/network/protocol/PacketUtils.java
|
|
@@ -1,6 +1,9 @@
|
|
package net.minecraft.network.protocol;
|
|
|
|
+import net.minecraft.network.Connection;
|
|
import net.minecraft.network.PacketListener;
|
|
+import net.minecraft.network.chat.TextComponent;
|
|
+import net.minecraft.network.protocol.game.ClientboundDisconnectPacket;
|
|
import org.apache.logging.log4j.LogManager;
|
|
import org.apache.logging.log4j.Logger;
|
|
import co.aikar.timings.MinecraftTimings; // Paper
|
|
@@ -32,6 +35,21 @@ public class PacketUtils {
|
|
try (Timing ignored = timing.startTiming()) { // Paper - timings
|
|
packet.handle(listener);
|
|
} // Paper - timings
|
|
+ // Paper start
|
|
+ catch (Exception e) {
|
|
+ Connection networkmanager = listener.getConnection();
|
|
+ if (networkmanager.getPlayer() != null) {
|
|
+ LOGGER.error("Error whilst processing packet {} for {}[{}]", packet, networkmanager.getPlayer().getScoreboardName(), networkmanager.getRemoteAddress(), e);
|
|
+ } else {
|
|
+ LOGGER.error("Error whilst processing packet {} for connection from {}", packet, networkmanager.getRemoteAddress(), e);
|
|
+ }
|
|
+ TextComponent error = new TextComponent("Packet processing error");
|
|
+ networkmanager.send(new ClientboundDisconnectPacket(error), (future) -> {
|
|
+ networkmanager.disconnect(error);
|
|
+ });
|
|
+ networkmanager.setReadOnly();
|
|
+ }
|
|
+ // Paper end
|
|
} else {
|
|
PacketUtils.LOGGER.debug("Ignoring packet due to disconnection: {}", packet);
|
|
}
|