PluginManager: Prevent infinite recursion in loadPlugins()

if a plugin calls loadPlugins(server->getPluginPath()) during its onLoad(), and it itself is in that plugin path, an infinite recursion will occur.
This commit is contained in:
Dylan K. Taylor 2021-10-20 23:10:18 +01:00
parent 620874d902
commit e2275cc8ec
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D

View File

@ -79,6 +79,8 @@ class PluginManager{
/** @var Plugin[] */
protected $enabledPlugins = [];
private bool $loadPluginsGuard = false;
/**
* @var PluginLoader[]
* @phpstan-var array<class-string<PluginLoader>, PluginLoader>
@ -320,6 +322,11 @@ class PluginManager{
* @return Plugin[]
*/
public function loadPlugins(string $path) : array{
if($this->loadPluginsGuard){
throw new \LogicException(__METHOD__ . "() cannot be called from within itself");
}
$this->loadPluginsGuard = true;
$triage = new PluginLoadTriage();
$this->triagePlugins($path, $triage);
@ -404,6 +411,7 @@ class PluginManager{
}
}
$this->loadPluginsGuard = false;
return $loadedPlugins;
}