From 0000000000000000000000000000000000000000 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 335bb1dcb7285edabb6c5e7ec6ba4d6d40c60dcb..a0353da423b13ce9be48a0ed194c0182808800d2 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 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