diff --git a/Spigot-Server-Patches/0426-Do-not-let-the-server-load-chunks-from-newer-version.patch b/Spigot-Server-Patches/0426-Do-not-let-the-server-load-chunks-from-newer-version.patch new file mode 100644 index 0000000000..9691cc7ba9 --- /dev/null +++ b/Spigot-Server-Patches/0426-Do-not-let-the-server-load-chunks-from-newer-version.patch @@ -0,0 +1,53 @@ +From 436002c12133ffec2180ad47f4b16609b6de4399 Mon Sep 17 00:00:00 2001 +From: Zach Brown +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 98cc4efc..f86d3aa2 100644 +--- a/src/main/java/net/minecraft/server/ChunkRegionLoader.java ++++ b/src/main/java/net/minecraft/server/ChunkRegionLoader.java +@@ -43,9 +43,23 @@ 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 tasksToExecuteOnMain = new ArrayDeque<>(); + // Paper end ++ // Paper start - Do NOT attempt to load chunks saved with newer versions ++ if (nbttagcompound.hasKeyOfType("DataVersion", 3)) { ++ 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 + ChunkGenerator chunkgenerator = worldserver.getChunkProvider().getChunkGenerator(); + WorldChunkManager worldchunkmanager = chunkgenerator.getWorldChunkManager(); + NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Level"); +diff --git a/src/main/java/net/minecraft/server/SharedConstants.java b/src/main/java/net/minecraft/server/SharedConstants.java +index cd04322e..7befab85 100644 +--- a/src/main/java/net/minecraft/server/SharedConstants.java ++++ b/src/main/java/net/minecraft/server/SharedConstants.java +@@ -33,6 +33,7 @@ public class SharedConstants { + return stringbuilder.toString(); + } + ++ public static GameVersion getGameVersion() { return a(); } // Paper - OBFHELPER + public static GameVersion a() { + if (SharedConstants.d == null) { + SharedConstants.d = MinecraftVersion.a(); +-- +2.24.1 +