mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-06-14 15:35:31 +00:00
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:
parent
620874d902
commit
e2275cc8ec
@ -79,6 +79,8 @@ class PluginManager{
|
|||||||
/** @var Plugin[] */
|
/** @var Plugin[] */
|
||||||
protected $enabledPlugins = [];
|
protected $enabledPlugins = [];
|
||||||
|
|
||||||
|
private bool $loadPluginsGuard = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var PluginLoader[]
|
* @var PluginLoader[]
|
||||||
* @phpstan-var array<class-string<PluginLoader>, PluginLoader>
|
* @phpstan-var array<class-string<PluginLoader>, PluginLoader>
|
||||||
@ -320,6 +322,11 @@ class PluginManager{
|
|||||||
* @return Plugin[]
|
* @return Plugin[]
|
||||||
*/
|
*/
|
||||||
public function loadPlugins(string $path) : array{
|
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();
|
$triage = new PluginLoadTriage();
|
||||||
$this->triagePlugins($path, $triage);
|
$this->triagePlugins($path, $triage);
|
||||||
|
|
||||||
@ -404,6 +411,7 @@ class PluginManager{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$this->loadPluginsGuard = false;
|
||||||
return $loadedPlugins;
|
return $loadedPlugins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user