diff --git a/src/CrashDump.php b/src/CrashDump.php index 5d813eb0e..ebcae05c2 100644 --- a/src/CrashDump.php +++ b/src/CrashDump.php @@ -280,8 +280,8 @@ class CrashDump{ } private function determinePluginFromFile(string $filePath, bool $crashFrame) : bool{ - $frameCleanPath = Filesystem::cleanPath($filePath); //this will be empty in phar stub - if(strpos($frameCleanPath, "plugins") === 0 and file_exists($filePath)){ + $frameCleanPath = Filesystem::cleanPath($filePath); + if(strpos($frameCleanPath, Filesystem::CLEAN_PATH_SRC_PREFIX) !== 0){ $this->addLine(); if($crashFrame){ $this->addLine("THIS CRASH WAS CAUSED BY A PLUGIN"); @@ -291,15 +291,17 @@ class CrashDump{ $this->data["plugin_involvement"] = self::PLUGIN_INVOLVEMENT_INDIRECT; } - $reflection = new \ReflectionClass(PluginBase::class); - $file = $reflection->getProperty("file"); - $file->setAccessible(true); - foreach($this->server->getPluginManager()->getPlugins() as $plugin){ - $filePath = Filesystem::cleanPath($file->getValue($plugin)); - if(strpos($frameCleanPath, $filePath) === 0){ - $this->data["plugin"] = $plugin->getName(); - $this->addLine("BAD PLUGIN: " . $plugin->getDescription()->getFullName()); - break; + if(file_exists($filePath)){ + $reflection = new \ReflectionClass(PluginBase::class); + $file = $reflection->getProperty("file"); + $file->setAccessible(true); + foreach($this->server->getPluginManager()->getPlugins() as $plugin){ + $filePath = Filesystem::cleanPath($file->getValue($plugin)); + if(strpos($frameCleanPath, $filePath) === 0){ + $this->data["plugin"] = $plugin->getName(); + $this->addLine("BAD PLUGIN: " . $plugin->getDescription()->getFullName()); + break; + } } } return true; diff --git a/src/utils/Filesystem.php b/src/utils/Filesystem.php index 6a9068bdd..2cada395a 100644 --- a/src/utils/Filesystem.php +++ b/src/utils/Filesystem.php @@ -53,6 +53,9 @@ final class Filesystem{ /** @var resource[] */ private static $lockFileHandles = []; + public const CLEAN_PATH_SRC_PREFIX = "pmsrc"; + public const CLEAN_PATH_PLUGINS_PREFIX = "plugins"; + private function __construct(){ //NOOP } @@ -87,13 +90,13 @@ final class Filesystem{ //remove relative paths //TODO: make these paths dynamic so they can be unit-tested against static $cleanPaths = [ - \pocketmine\PLUGIN_PATH => "plugins", //this has to come BEFORE \pocketmine\PATH because it's inside that by default on src installations - \pocketmine\PATH => "" + \pocketmine\PLUGIN_PATH => self::CLEAN_PATH_PLUGINS_PREFIX, //this has to come BEFORE \pocketmine\PATH because it's inside that by default on src installations + \pocketmine\PATH => self::CLEAN_PATH_SRC_PREFIX ]; foreach($cleanPaths as $cleanPath => $replacement){ $cleanPath = rtrim(str_replace([DIRECTORY_SEPARATOR, "phar://"], ["/", ""], $cleanPath), "/"); if(strpos($result, $cleanPath) === 0){ - $result = ltrim(str_replace($cleanPath, $replacement, $result), "/"); + $result = ltrim(str_replace($cleanPath, "[$replacement]", $result), "/"); } } return $result;