diff --git a/src/world/format/io/region/Anvil.php b/src/world/format/io/region/Anvil.php index 1bd9450f81..88951c92bf 100644 --- a/src/world/format/io/region/Anvil.php +++ b/src/world/format/io/region/Anvil.php @@ -36,7 +36,10 @@ class Anvil extends RegionWorldProvider{ } protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkYZX($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]); + return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkYZX( + self::readFixedSizeByteArray($subChunk, "Blocks", 4096), + self::readFixedSizeByteArray($subChunk, "Data", 2048) + )]); //ignore legacy light information } diff --git a/src/world/format/io/region/McRegion.php b/src/world/format/io/region/McRegion.php index 6f5ce48824..78288b6993 100644 --- a/src/world/format/io/region/McRegion.php +++ b/src/world/format/io/region/McRegion.php @@ -36,7 +36,6 @@ use pocketmine\world\format\io\ChunkUtils; use pocketmine\world\format\io\exception\CorruptedChunkException; use pocketmine\world\format\io\SubChunkConverter; use pocketmine\world\format\SubChunk; -use function str_repeat; use function zlib_decode; class McRegion extends RegionWorldProvider{ @@ -68,8 +67,8 @@ class McRegion extends RegionWorldProvider{ } $subChunks = []; - $fullIds = ($fullIdsTag = $chunk->getTag("Blocks")) instanceof ByteArrayTag ? $fullIdsTag->getValue() : str_repeat("\x00", 32768); - $fullData = ($fullDataTag = $chunk->getTag("Data")) instanceof ByteArrayTag ? $fullDataTag->getValue() : str_repeat("\x00", 16384); + $fullIds = self::readFixedSizeByteArray($chunk, "Blocks", 32768); + $fullData = self::readFixedSizeByteArray($chunk, "Data", 16384); for($y = 0; $y < 8; ++$y){ $subChunks[$y] = new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkFromLegacyColumn($fullIds, $fullData, $y)]); diff --git a/src/world/format/io/region/PMAnvil.php b/src/world/format/io/region/PMAnvil.php index 557026a9d3..960dd53691 100644 --- a/src/world/format/io/region/PMAnvil.php +++ b/src/world/format/io/region/PMAnvil.php @@ -36,7 +36,10 @@ class PMAnvil extends RegionWorldProvider{ use LegacyAnvilChunkTrait; protected function deserializeSubChunk(CompoundTag $subChunk) : SubChunk{ - return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkXZY($subChunk->getByteArray("Blocks"), $subChunk->getByteArray("Data"))]); + return new SubChunk(BlockLegacyIds::AIR << 4, [SubChunkConverter::convertSubChunkXZY( + self::readFixedSizeByteArray($subChunk, "Blocks", 4096), + self::readFixedSizeByteArray($subChunk, "Data", 2048) + )]); } protected static function getRegionFileExtension() : string{ diff --git a/src/world/format/io/region/RegionWorldProvider.php b/src/world/format/io/region/RegionWorldProvider.php index 06c259f371..fa2162fe11 100644 --- a/src/world/format/io/region/RegionWorldProvider.php +++ b/src/world/format/io/region/RegionWorldProvider.php @@ -24,6 +24,7 @@ declare(strict_types=1); namespace pocketmine\world\format\io\region; use pocketmine\nbt\NBT; +use pocketmine\nbt\tag\ByteArrayTag; use pocketmine\nbt\tag\CompoundTag; use pocketmine\nbt\tag\ListTag; use pocketmine\utils\Utils; @@ -41,6 +42,7 @@ use function mkdir; use function morton2d_encode; use function rename; use function scandir; +use function strlen; use function strrpos; use function substr; use function time; @@ -196,6 +198,18 @@ abstract class RegionWorldProvider extends BaseWorldProvider{ return $result; } + protected static function readFixedSizeByteArray(CompoundTag $chunk, string $tagName, int $length) : string{ + $tag = $chunk->getTag($tagName); + if(!($tag instanceof ByteArrayTag)){ + throw new CorruptedChunkException("Expected TAG_ByteArray for '$tagName'"); + } + $data = $tag->getValue(); + if(strlen($data) !== $length){ + throw new CorruptedChunkException("Expected '$tagName' payload to have exactly $length bytes, but have " . strlen($data)); + } + return $data; + } + /** * @throws CorruptedChunkException */