Mirror von
https://github.com/PaperMC/Paper.git
synchronisiert 2024-11-16 04:50:05 +01:00
bc127ea819
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 Bukkit Changes: eec4aab0 SPIGOT-6657: Add getPlayer to SheepDyeWoolEvent 205213c6 SPIGOT-6656: CauldronLevelChangeEvent is not fired correctly when dripstone fills the cauldron CraftBukkit Changes: b8c522d5 SPIGOT-6657: Add getPlayer to SheepDyeWoolEvent f04a77dc SPIGOT-6656: CauldronLevelChangeEvent is not fired correctly when dripstone fills the cauldron d1dbcebc SPIGOT-6653: Canceling snow bucket placement removes snow from bucket 4f34a67b #891: Fix scheduler task ID overflow and duplication issues Spigot Changes: d03d7f12 BUILDTOOLS-604: Rebuild patches
80 Zeilen
4.3 KiB
Diff
80 Zeilen
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 6611aebafb14b83bce3eeb87701e2edc8a0828ab..bb3b450c7e81ba47e1e8b2244d331f2ce44a7ee1 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);
|
|
}
|