From 331ae5498f59d54c097c37469921787455b49c6a Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 30 Jan 2019 12:29:04 +0000 Subject: [PATCH 1/3] Crash the generator when encountering invalid presets this is a partial fix for #2717, but still not ideal because it'll spam whenever a chunk is attempted to be generated. However, fixing this properly requires potentially breaking API changes. --- src/pocketmine/level/Level.php | 1 + src/pocketmine/level/generator/Flat.php | 32 ++++++++++++++++--- src/pocketmine/level/generator/Generator.php | 5 +++ .../InvalidGeneratorOptionsException.php | 28 ++++++++++++++++ .../level/generator/hell/Nether.php | 6 ++++ .../level/generator/normal/Normal.php | 6 ++++ 6 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/pocketmine/level/generator/InvalidGeneratorOptionsException.php diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index 69144cde55..b3066aa147 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -382,6 +382,7 @@ class Level implements ChunkManager, Metadatable{ $this->server->getLogger()->info($this->server->getLanguage()->translateString("pocketmine.level.preparing", [$this->displayName])); $this->generator = GeneratorManager::getGenerator($this->provider->getGenerator()); + //TODO: validate generator options $this->folderName = $name; diff --git a/src/pocketmine/level/generator/Flat.php b/src/pocketmine/level/generator/Flat.php index 1efa82c334..153fb57832 100644 --- a/src/pocketmine/level/generator/Flat.php +++ b/src/pocketmine/level/generator/Flat.php @@ -33,10 +33,11 @@ use pocketmine\level\generator\populator\Ore; use pocketmine\level\generator\populator\Populator; use pocketmine\math\Vector3; use pocketmine\utils\Random; +use function array_map; use function count; use function explode; +use function preg_match; use function preg_match_all; -use function str_replace; class Flat extends Generator{ /** @var Chunk */ @@ -62,6 +63,11 @@ class Flat extends Generator{ return "flat"; } + /** + * @param array $options + * + * @throws InvalidGeneratorOptionsException + */ public function __construct(array $options = []){ $this->options = $options; if(isset($this->options["preset"]) and $this->options["preset"] != ""){ @@ -89,13 +95,28 @@ class Flat extends Generator{ } } + /** + * @param string $layers + * + * @return int[][] + * @throws InvalidGeneratorOptionsException + */ public static function parseLayers(string $layers) : array{ $result = []; - preg_match_all('#^(([0-9]*x|)([0-9]{1,3})(|:[0-9]{0,2}))$#m', str_replace(",", "\n", $layers), $matches); + $split = array_map('\trim', explode(',', $layers)); $y = 0; - foreach($matches[3] as $i => $b){ - $b = ItemFactory::fromString($b . $matches[4][$i]); - $cnt = $matches[2][$i] === "" ? 1 : (int) $matches[2][$i]; + foreach($split as $line){ + preg_match('#^(?:(\d+)x)?(.+)$#', $line, $matches); + if(count($matches) !== 3){ + throw new InvalidGeneratorOptionsException("Invalid preset layer \"$line\""); + } + + $cnt = $matches[1] !== "" ? (int) $matches[1] : 1; + try{ + $b = ItemFactory::fromString($matches[2])->getBlock(); + }catch(\InvalidArgumentException $e){ + throw new InvalidGeneratorOptionsException("Invalid preset layer \"$line\": " . $e->getMessage(), 0, $e); + } for($cY = $y, $y += $cnt; $cY < $y; ++$cY){ $result[$cY] = [$b->getId(), $b->getDamage()]; } @@ -113,6 +134,7 @@ class Flat extends Generator{ $this->floorLevel = count($this->structure); + //TODO: more error checking preg_match_all('#(([0-9a-z_]{1,})\(?([0-9a-z_ =:]{0,})\)?),?#', $options, $matches); foreach($matches[2] as $i => $option){ $params = true; diff --git a/src/pocketmine/level/generator/Generator.php b/src/pocketmine/level/generator/Generator.php index b72c0a7ce5..dba5fa8a80 100644 --- a/src/pocketmine/level/generator/Generator.php +++ b/src/pocketmine/level/generator/Generator.php @@ -58,6 +58,11 @@ abstract class Generator{ /** @var Random */ protected $random; + /** + * @param array $settings + * + * @throws InvalidGeneratorOptionsException + */ abstract public function __construct(array $settings = []); diff --git a/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php b/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php new file mode 100644 index 0000000000..9489589f0d --- /dev/null +++ b/src/pocketmine/level/generator/InvalidGeneratorOptionsException.php @@ -0,0 +1,28 @@ + Date: Wed, 30 Jan 2019 12:49:16 +0000 Subject: [PATCH 2/3] Release 3.5.8 --- src/pocketmine/PocketMine.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 76c263bc9a..17b1ebbb75 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -38,7 +38,7 @@ namespace pocketmine { const NAME = "PocketMine-MP"; const BASE_VERSION = "3.5.8"; - const IS_DEVELOPMENT_BUILD = true; + const IS_DEVELOPMENT_BUILD = false; const BUILD_NUMBER = 0; const MIN_PHP_VERSION = "7.2.0"; From d3704bfae4828d7fe776a241a3e4dab3ccbdda65 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 30 Jan 2019 12:49:46 +0000 Subject: [PATCH 3/3] 3.5.9 is next --- src/pocketmine/PocketMine.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pocketmine/PocketMine.php b/src/pocketmine/PocketMine.php index 17b1ebbb75..70d4de0a85 100644 --- a/src/pocketmine/PocketMine.php +++ b/src/pocketmine/PocketMine.php @@ -37,8 +37,8 @@ namespace pocketmine { use pocketmine\wizard\SetupWizard; const NAME = "PocketMine-MP"; - const BASE_VERSION = "3.5.8"; - const IS_DEVELOPMENT_BUILD = false; + const BASE_VERSION = "3.5.9"; + const IS_DEVELOPMENT_BUILD = true; const BUILD_NUMBER = 0; const MIN_PHP_VERSION = "7.2.0";