aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch')
-rw-r--r--patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch35
1 files changed, 35 insertions, 0 deletions
diff --git a/patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch b/patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch
new file mode 100644
index 0000000000..ba7f1213ae
--- /dev/null
+++ b/patches/server/0419-Do-not-let-the-server-load-chunks-from-newer-version.patch
@@ -0,0 +1,35 @@
+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 7862caa0f787634cec14af81fe1f39803a43f115..1650541abeedce04ddeddfed15411b64a01be452 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
+@@ -124,8 +124,20 @@ public class ChunkSerializer {
+ InProgressChunkHolder holder = loadChunk(world, poiStorage, chunkPos, nbt, true);
+ return holder.protoChunk;
+ }
++ // 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 static InProgressChunkHolder loadChunk(ServerLevel world, PoiManager poiStorage, ChunkPos chunkPos, CompoundTag nbt, boolean distinguish) {
++ // Paper start - Do not let the server load chunks from newer versions
++ if (nbt.contains("DataVersion", net.minecraft.nbt.Tag.TAG_ANY_NUMERIC)) {
++ 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
+ ChunkPos chunkcoordintpair1 = new ChunkPos(nbt.getInt("xPos"), nbt.getInt("zPos")); // Paper - guard against serializing mismatching coordinates; diff on change, see ChunkSerializer#getChunkCoordinate
+