From 3d7e3185fc1bd0eb85c64a3546598d1e4864f5f1 Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Thu, 24 Jun 2021 15:31:49 +0200 Subject: [PATCH] Unshift crash reports when they are loaded, to break the recusion If, for whatever reason, during the loading of a crash reporter a new log entry is generated, then the lazy loading mechanism will be invoked *again* while it's already executed. This doesn't result in an endless recursion, but means that the crash reporters will be built and registered many times. This then means any further log entry will be logged x times instead of once. Unshift makes sure to take the class off the registration list right away, so another invokation of the same method won't try to do the same job. Signed-off-by: Christoph Wurst --- lib/private/Support/CrashReport/Registry.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/private/Support/CrashReport/Registry.php b/lib/private/Support/CrashReport/Registry.php index a5c39de98f006..96796d6370f84 100644 --- a/lib/private/Support/CrashReport/Registry.php +++ b/lib/private/Support/CrashReport/Registry.php @@ -35,6 +35,7 @@ use OCP\Support\CrashReport\IRegistry; use OCP\Support\CrashReport\IReporter; use Throwable; +use function array_shift; class Registry implements IRegistry { @@ -119,8 +120,7 @@ public function delegateMessage(string $message, array $context = []): void { } private function loadLazyProviders(): void { - $classes = $this->lazyReporters; - foreach ($classes as $class) { + while (($class = array_shift($this->lazyReporters)) !== null) { try { /** @var IReporter $reporter */ $reporter = $this->serverContainer->query($class); @@ -151,6 +151,5 @@ private function loadLazyProviders(): void { ]); } } - $this->lazyReporters = []; } }