From 1ec927f30c96862c0a883b8855673a777c3eada9 Mon Sep 17 00:00:00 2001 From: dordsor21 Date: Tue, 20 Jul 2021 20:49:47 +0100 Subject: [PATCH] Add check when obtaining BlockState from id to prevent edits losing large amounts of data --- .../com/sk89q/worldedit/world/block/BlockType.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java index b5d03e3c3..6ae60a706 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/world/block/BlockType.java @@ -26,6 +26,7 @@ import com.sk89q.worldedit.extent.Extent; import com.sk89q.worldedit.extent.NullExtent; import com.sk89q.worldedit.function.mask.SingleBlockTypeMask; import com.sk89q.worldedit.function.pattern.Pattern; +import com.sk89q.worldedit.internal.util.LogManagerCompat; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.registry.Keyed; import com.sk89q.worldedit.registry.NamespacedRegistry; @@ -38,6 +39,7 @@ import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; import com.sk89q.worldedit.world.registry.BlockMaterial; import com.sk89q.worldedit.world.registry.LegacyMapper; +import org.apache.logging.log4j.Logger; import java.util.Collections; import java.util.List; @@ -53,6 +55,7 @@ import static com.google.common.base.Preconditions.checkArgument; public class BlockType implements Keyed, Pattern { public static final NamespacedRegistry REGISTRY = new NamespacedRegistry<>("block type"); + private static final Logger LOGGER = LogManagerCompat.getLogger(); private final String id; private final BlockTypesCache.Settings settings; @@ -138,8 +141,16 @@ public class BlockType implements Keyed, Pattern { public BlockState withPropertyId(int propertyId) { if (settings.stateOrdinals == null) { return settings.defaultState; + } else if (propertyId >= settings.stateOrdinals.length || propertyId < 0) { + LOGGER.error("Attempted to load blockstate with id {} of type {} outside of state ordinals length. Using default state.", propertyId, getId()); + return settings.defaultState; } - return BlockTypesCache.states[settings.stateOrdinals[propertyId]]; + int ordinal = settings.stateOrdinals[propertyId]; + if (ordinal >= BlockTypesCache.states.length || ordinal < 0) { + LOGGER.error("Attempted to load blockstate with ordinal {} of type {} outside of states length. Using default state. Using default state.", ordinal, getId()); + return settings.defaultState; + } + return BlockTypesCache.states[ordinal]; } @Deprecated