aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorSpottedleaf <[email protected]>2021-12-27 04:11:21 -0800
committerSpottedleaf <[email protected]>2021-12-27 04:16:22 -0800
commit22be4d5c603f4046e2e6bea3fd7e139e3085b7b4 (patch)
tree1cdab04503ec1a45d3e95d4f8105776e908903d3
parent692283dbe2d37d81903bca61a99ab0904be8d5fe (diff)
downloadPaper-22be4d5c603f4046e2e6bea3fd7e139e3085b7b4.tar.gz
Paper-22be4d5c603f4046e2e6bea3fd7e139e3085b7b4.zip
Defensively copy chunk data in upgradeChunkTag
The data provided is always from the regionfile thread, which does not copy the data out. So if two separate calls need the data, then there's going to be a problem.
-rw-r--r--patches/server/0258-Asynchronous-chunk-IO-and-loading.patch14
-rw-r--r--patches/server/0352-Guard-against-serializing-mismatching-chunk-coordina.patch4
-rw-r--r--patches/server/0778-Rewrite-dataconverter-system.patch8
3 files changed, 17 insertions, 9 deletions
diff --git a/patches/server/0258-Asynchronous-chunk-IO-and-loading.patch b/patches/server/0258-Asynchronous-chunk-IO-and-loading.patch
index 18d8ac3225..c219860577 100644
--- a/patches/server/0258-Asynchronous-chunk-IO-and-loading.patch
+++ b/patches/server/0258-Asynchronous-chunk-IO-and-loading.patch
@@ -3170,7 +3170,7 @@ index 1729af83b979e35a585c8d049b14dc23ddf23803..89de1589833dcce8028fd402aea8a3e5
CompoundTag nbttagcompound3 = new CompoundTag();
Iterator iterator1 = chunk.getHeightmaps().iterator();
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
-index 2d1c8d5cf8ea6739d5e9df91cc16cde72917feff..d7fab2fb61dc3de14e382bac6127db956605e7ad 100644
+index 2d1c8d5cf8ea6739d5e9df91cc16cde72917feff..ba677f282f2c8a05d1bad88226655549a81679bb 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
@@ -25,27 +25,38 @@ import net.minecraft.world.level.storage.DimensionDataStorage;
@@ -3218,7 +3218,15 @@ index 2d1c8d5cf8ea6739d5e9df91cc16cde72917feff..d7fab2fb61dc3de14e382bac6127db95
if (nbt != null) {
CompoundTag level = nbt.getCompound("Level");
if (level.getBoolean("TerrainPopulated")) {
-@@ -80,11 +91,13 @@ public class ChunkStorage implements AutoCloseable {
+@@ -63,6 +74,7 @@ public class ChunkStorage implements AutoCloseable {
+
+ public CompoundTag upgradeChunkTag(ResourceKey<LevelStem> resourcekey, Supplier<DimensionDataStorage> supplier, CompoundTag nbttagcompound, Optional<ResourceKey<Codec<? extends ChunkGenerator>>> optional, ChunkPos pos, @Nullable LevelAccessor generatoraccess) throws IOException {
+ // CraftBukkit end
++ nbttagcompound = nbttagcompound.copy(); // Paper - defensive copy, another thread might modify this
+ int i = ChunkStorage.getVersion(nbttagcompound);
+
+ // CraftBukkit start
+@@ -80,11 +92,13 @@ public class ChunkStorage implements AutoCloseable {
if (i < 1493) {
nbttagcompound = NbtUtils.update(this.fixerUpper, DataFixTypes.CHUNK, nbttagcompound, i, 1493);
if (nbttagcompound.getCompound("Level").getBoolean("hasLegacyStructureData")) {
@@ -3232,7 +3240,7 @@ index 2d1c8d5cf8ea6739d5e9df91cc16cde72917feff..d7fab2fb61dc3de14e382bac6127db95
}
}
-@@ -129,26 +142,39 @@ public class ChunkStorage implements AutoCloseable {
+@@ -129,26 +143,39 @@ public class ChunkStorage implements AutoCloseable {
@Nullable
public CompoundTag read(ChunkPos chunkPos) throws IOException {
diff --git a/patches/server/0352-Guard-against-serializing-mismatching-chunk-coordina.patch b/patches/server/0352-Guard-against-serializing-mismatching-chunk-coordina.patch
index 369500bf2c..a7467b9f93 100644
--- a/patches/server/0352-Guard-against-serializing-mismatching-chunk-coordina.patch
+++ b/patches/server/0352-Guard-against-serializing-mismatching-chunk-coordina.patch
@@ -38,10 +38,10 @@ index 3e631d55d30831a4063e23f9dbc7a315d11a7b68..cf86755050632b158576849b78607978
if (!Objects.equals(chunkPos, chunkcoordintpair1)) {
ChunkSerializer.LOGGER.error("Chunk file at {} is in the wrong location; relocating. (Expected {}, got {})", chunkPos, chunkPos, chunkcoordintpair1);
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
-index d7fab2fb61dc3de14e382bac6127db956605e7ad..b1b1fa19cfd533d5625a462af399c5fd055629b0 100644
+index ba677f282f2c8a05d1bad88226655549a81679bb..392fd2f5919d6a8f37c9f2b0421831d6ce381e0c 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
-@@ -147,6 +147,13 @@ public class ChunkStorage implements AutoCloseable {
+@@ -148,6 +148,13 @@ public class ChunkStorage implements AutoCloseable {
// Paper start - async chunk io
public void write(ChunkPos chunkPos, CompoundTag nbt) throws IOException {
diff --git a/patches/server/0778-Rewrite-dataconverter-system.patch b/patches/server/0778-Rewrite-dataconverter-system.patch
index c2ceaf8d0f..99ba9019d7 100644
--- a/patches/server/0778-Rewrite-dataconverter-system.patch
+++ b/patches/server/0778-Rewrite-dataconverter-system.patch
@@ -21609,10 +21609,10 @@ index 0000000000000000000000000000000000000000..967ad1186cbc81a76a4958ea99d4eff3
+ }
+}
diff --git a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
-index d44154ba43e06934d7889f2f20d1a27765504574..f8167882a0f11c6fff86e494800864ecf59bb8b5 100644
+index a5a45118644fc1bc8caeefa59b5f897ed590e7ae..8dfac195e7f03f8fe18ba6ee79e195efade46bea 100644
--- a/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
+++ b/src/main/java/net/minecraft/world/level/chunk/storage/ChunkStorage.java
-@@ -78,7 +78,7 @@ public class ChunkStorage implements AutoCloseable {
+@@ -79,7 +79,7 @@ public class ChunkStorage implements AutoCloseable {
int i = ChunkStorage.getVersion(nbttagcompound);
// CraftBukkit start
@@ -21621,7 +21621,7 @@ index d44154ba43e06934d7889f2f20d1a27765504574..f8167882a0f11c6fff86e494800864ec
CompoundTag level = nbttagcompound.getCompound("Level");
if (level.getBoolean("TerrainPopulated") && !level.getBoolean("LightPopulated")) {
ServerChunkCache cps = (generatoraccess == null) ? null : ((ServerLevel) generatoraccess).getChunkSource();
-@@ -90,7 +90,7 @@ public class ChunkStorage implements AutoCloseable {
+@@ -91,7 +91,7 @@ public class ChunkStorage implements AutoCloseable {
// CraftBukkit end
if (i < 1493) {
@@ -21630,7 +21630,7 @@ index d44154ba43e06934d7889f2f20d1a27765504574..f8167882a0f11c6fff86e494800864ec
if (nbttagcompound.getCompound("Level").getBoolean("hasLegacyStructureData")) {
synchronized (this.persistentDataLock) { // Paper - Async chunk loading
if (this.legacyStructureHandler == null) {
-@@ -112,7 +112,7 @@ public class ChunkStorage implements AutoCloseable {
+@@ -113,7 +113,7 @@ public class ChunkStorage implements AutoCloseable {
// Spigot end
ChunkStorage.injectDatafixingContext(nbttagcompound, resourcekey, optional);