aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZach Brown <[email protected]>2020-08-21 19:27:25 -0400
committerAikar <[email protected]>2020-08-21 19:27:25 -0400
commit7470c3ef69fa31044473e39ad03a8e133026d45d (patch)
treef49d4edb487f10c023ff6ec0eb012caa2ab1d862
parentcb50e74436245cc7128b32b1d3668db1522ac455 (diff)
downloadPaper-7470c3ef69fa31044473e39ad03a8e133026d45d.tar.gz
Paper-7470c3ef69fa31044473e39ad03a8e133026d45d.zip
Do not let the server load chunks from newer versions (1.16.2+)
If the server attempts to load a chunk generated by a newer version of the game, immediately stop the server to prevent data corruption. You can override this functionality at your own peril.
-rw-r--r--Spigot-Server-Patches/0553-Do-not-let-the-server-load-chunks-from-newer-version.patch39
1 files changed, 39 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0553-Do-not-let-the-server-load-chunks-from-newer-version.patch b/Spigot-Server-Patches/0553-Do-not-let-the-server-load-chunks-from-newer-version.patch
new file mode 100644
index 0000000000..f58f41602a
--- /dev/null
+++ b/Spigot-Server-Patches/0553-Do-not-let-the-server-load-chunks-from-newer-version.patch
@@ -0,0 +1,39 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Zach Brown <[email protected]>
+Date: Tue, 23 Jul 2019 20:44:47 -0500
+Subject: [PATCH] Do not let the server load chunks from newer versions
+
+If the server attempts to load a chunk generated by a newer version of
+the game, immediately stop the server to prevent data corruption.
+
+You can override this functionality at your own peril.
+
+diff --git a/src/main/java/net/minecraft/server/ChunkRegionLoader.java b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
+index ac58fcb7985ebe0cfdab6e1400deb37c233ff637..66a39d75394236f5ee745da7ac0b0ac5fe71f911 100644
+--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java
++++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java
+@@ -51,10 +51,24 @@ public class ChunkRegionLoader {
+ return holder.protoChunk;
+ }
+
++ // Paper start
++ private static final int CURRENT_DATA_VERSION = SharedConstants.getGameVersion().getWorldVersion();
++ private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion");
++ // Paper end
++
+ public static InProgressChunkHolder loadChunk(WorldServer worldserver, DefinedStructureManager definedstructuremanager, VillagePlace villageplace, ChunkCoordIntPair chunkcoordintpair, NBTTagCompound nbttagcompound, boolean distinguish) {
+ ArrayDeque<Runnable> tasksToExecuteOnMain = new ArrayDeque<>();
+ // Paper end
+ ChunkGenerator chunkgenerator = worldserver.getChunkProvider().getChunkGenerator();
++ // Paper start - Do NOT attempt to load chunks saved with newer versions
++ if (nbttagcompound.hasKeyOfType("DataVersion", 99)) {
++ int dataVersion = nbttagcompound.getInt("DataVersion");
++ if (!JUST_CORRUPT_IT && dataVersion > CURRENT_DATA_VERSION) {
++ new RuntimeException("Server attempted to load chunk saved with newer version of minecraft! " + dataVersion + " > " + CURRENT_DATA_VERSION).printStackTrace();
++ System.exit(1);
++ }
++ }
++ // Paper end
+ WorldChunkManager worldchunkmanager = chunkgenerator.getWorldChunkManager();
+ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Level"); // Paper - diff on change, see ChunkRegionLoader#getChunkCoordinate
+ ChunkCoordIntPair chunkcoordintpair1 = new ChunkCoordIntPair(nbttagcompound1.getInt("xPos"), nbttagcompound1.getInt("zPos")); // Paper - diff on change, see ChunkRegionLoader#getChunkCoordinate