diff options
Diffstat (limited to 'patches/server/0895-Fix-race-condition-on-UpgradeData.BlockFixers-class-.patch')
-rw-r--r-- | patches/server/0895-Fix-race-condition-on-UpgradeData.BlockFixers-class-.patch | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/patches/server/0895-Fix-race-condition-on-UpgradeData.BlockFixers-class-.patch b/patches/server/0895-Fix-race-condition-on-UpgradeData.BlockFixers-class-.patch new file mode 100644 index 0000000000..e1f2934daa --- /dev/null +++ b/patches/server/0895-Fix-race-condition-on-UpgradeData.BlockFixers-class-.patch @@ -0,0 +1,27 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Spottedleaf <[email protected]> +Date: Tue, 8 Aug 2023 17:29:33 -0700 +Subject: [PATCH] Fix race condition on UpgradeData.BlockFixers class init + +The CHUNKY_FIXERS field is modified during the constructors +of the BlockFixers, but the code that uses CHUNKY_FIXERS does +not properly ensure that BlockFixers has been initialised before +using it, leading to a possible race condition where instances of +BlockFixers are accessed before they have initialised correctly. + +We can force the class to initialise fully before accessing the +field by calling any method on the class, and for convenience +we use values(). + +diff --git a/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java b/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java +index 22b6d0851a51da180cd8fbbe6554c5370f5ac5bd..cd9b65f278a750a0177a3252271015d43172b2e9 100644 +--- a/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java ++++ b/src/main/java/net/minecraft/world/level/chunk/UpgradeData.java +@@ -140,6 +140,7 @@ public class UpgradeData { + Fluid fluid = tick.type() == Fluids.EMPTY ? level.getFluidState(tick.pos()).getType() : tick.type(); + level.scheduleTick(tick.pos(), fluid, tick.delay(), tick.priority()); + }); ++ UpgradeData.BlockFixers.values(); // Paper - force the class init so that we don't access CHUNKY_FIXERS before all BlockFixers are initialised + CHUNKY_FIXERS.forEach(logic -> logic.processChunk(level)); + } + |