aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-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