aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorZach Brown <[email protected]>2020-01-12 17:05:27 -0600
committerZach Brown <[email protected]>2020-01-12 17:05:27 -0600
commit2ecb1c64831cf4bf944a76706b88505b9dcd5eaf (patch)
treeee5f219022ded3805ab5605c4c63d34ababa730f
parent84048a8a361548105fb87166a17df8fd37747616 (diff)
downloadPaper-2ecb1c64831cf4bf944a76706b88505b9dcd5eaf.tar.gz
Paper-2ecb1c64831cf4bf944a76706b88505b9dcd5eaf.zip
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.
-rw-r--r--Spigot-Server-Patches/0426-Do-not-let-the-server-load-chunks-from-newer-version.patch53
1 files changed, 53 insertions, 0 deletions
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 <[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 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<Runnable> 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
+