aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch')
-rw-r--r--patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch41
1 files changed, 41 insertions, 0 deletions
diff --git a/patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch b/patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch
new file mode 100644
index 0000000000..4c1742107a
--- /dev/null
+++ b/patches/server/0409-Do-not-let-the-server-load-chunks-from-newer-version.patch
@@ -0,0 +1,41 @@
+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/world/level/chunk/storage/ChunkSerializer.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
+index b3f8df13e97cbde7dd914b42004d186f90b78646..2ca1f01ab59000949cbde1766c9811a72dbfb4ff 100644
+--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
++++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkSerializer.java
+@@ -86,6 +86,10 @@ public class ChunkSerializer {
+ public static final String BLOCK_LIGHT_TAG = "BlockLight";
+ public static final String SKY_LIGHT_TAG = "SkyLight";
+
++ // Paper start - Do not let the server load chunks from newer versions
++ private static final int CURRENT_DATA_VERSION = net.minecraft.SharedConstants.getCurrentVersion().getDataVersion().getVersion();
++ private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion");
++ // Paper end - Do not let the server load chunks from newer versions
+ public ChunkSerializer() {}
+
+ // Paper start - guard against serializing mismatching coordinates
+@@ -101,6 +105,15 @@ public class ChunkSerializer {
+ }
+ // Paper end - guard against serializing mismatching coordinates
+ public static ProtoChunk read(ServerLevel world, PoiManager poiStorage, ChunkPos chunkPos, CompoundTag nbt) {
++ // Paper start - Do not let the server load chunks from newer versions
++ if (nbt.contains("DataVersion", net.minecraft.nbt.Tag.TAG_ANY_NUMERIC)) {
++ final int dataVersion = nbt.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 - Do not let the server load chunks from newer versions
+ ChunkPos chunkcoordintpair1 = new ChunkPos(nbt.getInt("xPos"), nbt.getInt("zPos")); // Paper - guard against serializing mismatching coordinates; diff on change, see ChunkSerializer#getChunkCoordinate
+
+ if (!Objects.equals(chunkPos, chunkcoordintpair1)) {