diff --git a/src/pocketmine/level/format/anvil/RegionLoader.php b/src/pocketmine/level/format/anvil/RegionLoader.php index 5d102d470..b98b0ce14 100644 --- a/src/pocketmine/level/format/anvil/RegionLoader.php +++ b/src/pocketmine/level/format/anvil/RegionLoader.php @@ -88,6 +88,12 @@ class RegionLoader extends \pocketmine\level\format\mcregion\RegionLoader{ $compression = ord(fgetc($this->filePointer)); } + if($length >= self::MAX_SECTOR_LENGTH){ + MainLogger::getLogger()->error("Corrupted chunk header detected"); + + return false; + } + if($length > ($this->locationTable[$index][1] << 12)){ //Invalid chunk, bigger than defined number of sectors MainLogger::getLogger()->error("Corrupted chunk detected"); $this->locationTable[$index][1] = $length >> 12; diff --git a/src/pocketmine/level/format/mcregion/RegionLoader.php b/src/pocketmine/level/format/mcregion/RegionLoader.php index b5c9e33a7..8224e53d3 100644 --- a/src/pocketmine/level/format/mcregion/RegionLoader.php +++ b/src/pocketmine/level/format/mcregion/RegionLoader.php @@ -38,6 +38,7 @@ class RegionLoader{ const VERSION = 1; const COMPRESSION_GZIP = 1; const COMPRESSION_ZLIB = 2; + const MAX_SECTOR_LENGTH = 32 << 12; //32 sectors public static $COMPRESSION_LEVEL = 7; protected $x; @@ -109,6 +110,12 @@ class RegionLoader{ $compression = ord(fgetc($this->filePointer)); } + if($length >= self::MAX_SECTOR_LENGTH){ + MainLogger::getLogger()->error("Corrupted chunk header detected"); + + return false; + } + if($length > ($this->locationTable[$index][1] << 12)){ //Invalid chunk, bigger than defined number of sectors MainLogger::getLogger()->error("Corrupted bigger chunk detected"); $this->locationTable[$index][1] = $length >> 12;