aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch
diff options
context:
space:
mode:
Diffstat (limited to 'patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch')
-rw-r--r--patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch37
1 files changed, 37 insertions, 0 deletions
diff --git a/patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch b/patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch
new file mode 100644
index 0000000000..efa8bf5dc9
--- /dev/null
+++ b/patches/server/0463-Do-not-let-the-server-load-chunks-from-newer-version.patch
@@ -0,0 +1,37 @@
+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 3c61be19c65b2da9283b2aba2b4e66f84bac6e1c..31e552e1b4c3a6931a61a88a75965a0427d6de8d 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
+@@ -126,9 +126,22 @@ public class ChunkSerializer {
+ return holder.protoChunk;
+ }
+
++ // Paper start
++ private static final int CURRENT_DATA_VERSION = SharedConstants.getCurrentVersion().getDataVersion().getVersion();
++ private static final boolean JUST_CORRUPT_IT = Boolean.getBoolean("Paper.ignoreWorldDataVersion");
++ // Paper end
+ public static InProgressChunkHolder loadChunk(ServerLevel world, PoiManager poiStorage, ChunkPos chunkPos, CompoundTag nbt, boolean distinguish) {
+ java.util.ArrayDeque<Runnable> tasksToExecuteOnMain = new java.util.ArrayDeque<>();
+ // Paper end
++ // Paper start - Do NOT attempt to load chunks saved with newer versions
++ if (nbt.contains("DataVersion", 99)) {
++ 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 - diff on change, see ChunkSerializer#getChunkCoordinate
+
+ if (!Objects.equals(chunkPos, chunkcoordintpair1)) {