From 7a57f23710227ecb4d54df9e31d5b96a7fb31ef4 Mon Sep 17 00:00:00 2001 From: Zach Brown Date: Sun, 23 Sep 2018 20:10:24 -0400 Subject: [PATCH] Make bad custom name resolution more specific Avoids interfering with other places in vanilla where these issues are tolerated and expected. --- ...arseException-in-Entity-and-TE-names.patch | 155 ++++++++++++++++++ ...e-get-a-ParseException-in-IChatBaseC.patch | 41 ----- 2 files changed, 155 insertions(+), 41 deletions(-) create mode 100644 Spigot-Server-Patches/0381-Catch-JsonParseException-in-Entity-and-TE-names.patch delete mode 100644 Spigot-Server-Patches/0381-Return-null-if-we-get-a-ParseException-in-IChatBaseC.patch diff --git a/Spigot-Server-Patches/0381-Catch-JsonParseException-in-Entity-and-TE-names.patch b/Spigot-Server-Patches/0381-Catch-JsonParseException-in-Entity-and-TE-names.patch new file mode 100644 index 000000000..172fd2216 --- /dev/null +++ b/Spigot-Server-Patches/0381-Catch-JsonParseException-in-Entity-and-TE-names.patch @@ -0,0 +1,155 @@ +From 6ed05ed8dce0c0fda2374cd0f6e529bd1f7643da Mon Sep 17 00:00:00 2001 +From: Zach Brown +Date: Sat, 22 Sep 2018 15:56:59 -0400 +Subject: [PATCH] Catch JsonParseException in Entity and TE names + +As a result, data that no longer parses correctly will not crash the server +instead just logging the exception and continuing (and in most cases should +fix the data) + +Player data is fixed pretty much immediately but some block data (like +Shulkers) may need to be changed in order for it to re-save properly + +No more crashing though. + +diff --git a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java +index 729859d13..2a1dffbf4 100644 +--- a/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java ++++ b/src/main/java/net/minecraft/server/CommandBlockListenerAbstract.java +@@ -57,7 +57,7 @@ public abstract class CommandBlockListenerAbstract implements ICommandListener { + this.g = nbttagcompound.getString("Command"); + this.d = nbttagcompound.getInt("SuccessCount"); + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.h = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.h = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + if (nbttagcompound.hasKeyOfType("TrackOutput", 1)) { +diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java +index f6c43bab4..8c2ce7006 100644 +--- a/src/main/java/net/minecraft/server/Entity.java ++++ b/src/main/java/net/minecraft/server/Entity.java +@@ -1733,7 +1733,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, Ke + this.setPosition(this.locX, this.locY, this.locZ); + this.setYawPitch(this.yaw, this.pitch); + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.setCustomName(IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName"))); ++ this.setCustomName(MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound)); // Paper - Catch ParseException + } + + this.setCustomNameVisible(nbttagcompound.getBoolean("CustomNameVisible")); +diff --git a/src/main/java/net/minecraft/server/MCUtil.java b/src/main/java/net/minecraft/server/MCUtil.java +index f7856897f..a50224734 100644 +--- a/src/main/java/net/minecraft/server/MCUtil.java ++++ b/src/main/java/net/minecraft/server/MCUtil.java +@@ -363,4 +363,16 @@ public final class MCUtil { + return null; + } + } ++ ++ @Nullable ++ public static IChatBaseComponent getBaseComponentFromNbt(String key, NBTTagCompound compound) { ++ IChatBaseComponent component = null; ++ try { ++ component = IChatBaseComponent.ChatSerializer.a(compound.getString("CustomName")); ++ } catch (com.google.gson.JsonParseException ignored) { ++ org.bukkit.Bukkit.getLogger().warning("Unable to load " + key + " from " + compound); ++ } ++ ++ return component; ++ } + } +diff --git a/src/main/java/net/minecraft/server/TileEntityBanner.java b/src/main/java/net/minecraft/server/TileEntityBanner.java +index b4fae0d30..364a9fa7a 100644 +--- a/src/main/java/net/minecraft/server/TileEntityBanner.java ++++ b/src/main/java/net/minecraft/server/TileEntityBanner.java +@@ -74,7 +74,7 @@ public class TileEntityBanner extends TileEntity implements INamableTileEntity { + public void load(NBTTagCompound nbttagcompound) { + super.load(nbttagcompound); + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.a = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.a = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + if (this.hasWorld()) { +diff --git a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +index 480faa66e..f3ddb86d0 100644 +--- a/src/main/java/net/minecraft/server/TileEntityBrewingStand.java ++++ b/src/main/java/net/minecraft/server/TileEntityBrewingStand.java +@@ -236,7 +236,7 @@ public class TileEntityBrewingStand extends TileEntityContainer implements IWorl + ContainerUtil.b(nbttagcompound, this.items); + this.brewTime = nbttagcompound.getShort("BrewTime"); + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.k = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.k = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + this.fuelLevel = nbttagcompound.getByte("Fuel"); +diff --git a/src/main/java/net/minecraft/server/TileEntityChest.java b/src/main/java/net/minecraft/server/TileEntityChest.java +index 7594c16e9..803793072 100644 +--- a/src/main/java/net/minecraft/server/TileEntityChest.java ++++ b/src/main/java/net/minecraft/server/TileEntityChest.java +@@ -83,7 +83,7 @@ public class TileEntityChest extends TileEntityLootable { // Paper - Remove ITic + } + + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + } +diff --git a/src/main/java/net/minecraft/server/TileEntityDispenser.java b/src/main/java/net/minecraft/server/TileEntityDispenser.java +index ddd2e0eb0..21bd156e9 100644 +--- a/src/main/java/net/minecraft/server/TileEntityDispenser.java ++++ b/src/main/java/net/minecraft/server/TileEntityDispenser.java +@@ -107,7 +107,7 @@ public class TileEntityDispenser extends TileEntityLootable { + } + + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + } +diff --git a/src/main/java/net/minecraft/server/TileEntityFurnace.java b/src/main/java/net/minecraft/server/TileEntityFurnace.java +index a537d35b7..f6bc6403f 100644 +--- a/src/main/java/net/minecraft/server/TileEntityFurnace.java ++++ b/src/main/java/net/minecraft/server/TileEntityFurnace.java +@@ -219,7 +219,7 @@ public class TileEntityFurnace extends TileEntityContainer implements IWorldInve + } + + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.l = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.l = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + // Paper start - cook speed API +diff --git a/src/main/java/net/minecraft/server/TileEntityHopper.java b/src/main/java/net/minecraft/server/TileEntityHopper.java +index a8cf160fe..c56422170 100644 +--- a/src/main/java/net/minecraft/server/TileEntityHopper.java ++++ b/src/main/java/net/minecraft/server/TileEntityHopper.java +@@ -61,7 +61,7 @@ public class TileEntityHopper extends TileEntityLootable implements IHopper, ITi + } + + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.setCustomName(IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName"))); ++ this.setCustomName(MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound)); // Paper - Catch ParseException + } + + this.f = nbttagcompound.getInt("TransferCooldown"); +diff --git a/src/main/java/net/minecraft/server/TileEntityShulkerBox.java b/src/main/java/net/minecraft/server/TileEntityShulkerBox.java +index df9a30560..65a685452 100644 +--- a/src/main/java/net/minecraft/server/TileEntityShulkerBox.java ++++ b/src/main/java/net/minecraft/server/TileEntityShulkerBox.java +@@ -254,7 +254,7 @@ public class TileEntityShulkerBox extends TileEntityLootable implements IWorldIn + } + + if (nbttagcompound.hasKeyOfType("CustomName", 8)) { +- this.i = IChatBaseComponent.ChatSerializer.a(nbttagcompound.getString("CustomName")); ++ this.i = MCUtil.getBaseComponentFromNbt("CustomName", nbttagcompound); // Paper - Catch ParseException + } + + } +-- +2.19.0 + diff --git a/Spigot-Server-Patches/0381-Return-null-if-we-get-a-ParseException-in-IChatBaseC.patch b/Spigot-Server-Patches/0381-Return-null-if-we-get-a-ParseException-in-IChatBaseC.patch deleted file mode 100644 index f462f9255..000000000 --- a/Spigot-Server-Patches/0381-Return-null-if-we-get-a-ParseException-in-IChatBaseC.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 691b112b9931b505d5acb88a4ccdf7e994f03677 Mon Sep 17 00:00:00 2001 -From: Zach Brown -Date: Sat, 22 Sep 2018 15:56:59 -0400 -Subject: [PATCH] Return null if we get a ParseException in IChatBaseComponent - -This is allowed as the method is explicitly marked as nullable and is -preferable to returning an empty string in this instance. - -As a result, data that no longer parses correctly will not crash the server -instead just logging the exception and continuing (and in most cases should -fix the data) - -Player data is fixed pretty much immediately but some block data (like -Shulkers) may need to be changed in order for it to re-save properly - -No more crashing though. - -diff --git a/src/main/java/net/minecraft/server/IChatBaseComponent.java b/src/main/java/net/minecraft/server/IChatBaseComponent.java -index ff14b3e09..03c148f4f 100644 ---- a/src/main/java/net/minecraft/server/IChatBaseComponent.java -+++ b/src/main/java/net/minecraft/server/IChatBaseComponent.java -@@ -357,7 +357,15 @@ public interface IChatBaseComponent extends Message, Iterable