diff --git a/Spigot-Server-Patches/0438-Handle-bad-chunks-more-gracefully.patch b/Spigot-Server-Patches/0438-Handle-bad-chunks-more-gracefully.patch new file mode 100644 index 0000000000..d1e27249b4 --- /dev/null +++ b/Spigot-Server-Patches/0438-Handle-bad-chunks-more-gracefully.patch @@ -0,0 +1,60 @@ +From a5bd0235ffaaae6207d3ac887c2b8ccc2b60d39d Mon Sep 17 00:00:00 2001 +From: Shane Freeder +Date: Mon, 15 Apr 2019 02:24:52 +0100 +Subject: [PATCH] Handle bad chunks more gracefully + +Prior to this change the server would crash when attempting to load a +chunk from a region with bad data. + +After this change the server will defer back to vanilla behavior. At +this time, that means attempting to generate a chunk in its place +(and occasionally just not generating anything and leaving small +holes in the world (This statement might not be accurate as of 1.13.x)). + +Should Mojang choose to alter this behavior in the future, this change +will simply defer to whatever that new behavior is. + +diff --git a/src/main/java/net/minecraft/server/RegionFileCache.java b/src/main/java/net/minecraft/server/RegionFileCache.java +index 17e76815ad..2eb7888027 100644 +--- a/src/main/java/net/minecraft/server/RegionFileCache.java ++++ b/src/main/java/net/minecraft/server/RegionFileCache.java +@@ -171,8 +171,20 @@ public class RegionFileCache { + private static NBTTagCompound readOversizedChunk(RegionFile regionfile, int i, int j) throws IOException { + synchronized (regionfile) { + try (DataInputStream datainputstream = regionfile.getReadStream(i & 31, j & 31)) { ++ // Paper start - Handle bad chunks more gracefully - also handle similarly with oversized data + NBTTagCompound oversizedData = regionfile.getOversizedData(i, j); +- NBTTagCompound chunk = NBTCompressedStreamTools.readNBT(datainputstream); ++ ++ try { ++ oversizedData = regionfile.getOversizedData(i, j); ++ } catch (Exception ex) {} ++ ++ NBTTagCompound chunk; ++ try { ++ chunk = NBTCompressedStreamTools.readNBT(datainputstream); ++ } catch (Exception ex) { ++ return null; ++ } ++ // Paper end + if (oversizedData == null) { + return chunk; + } +@@ -251,7 +263,13 @@ public class RegionFileCache { + return null; + } + +- return NBTCompressedStreamTools.a(datainputstream); ++ // Paper start - Handle bad chunks more gracefully ++ try { ++ return NBTCompressedStreamTools.a(datainputstream); ++ } catch (Exception ex) { ++ return null; ++ } ++ // Paper end + } + + @Nullable +-- +2.21.0 +