From 018020108bef98b393bc0a4da11ca049ddc06234 Mon Sep 17 00:00:00 2001
From: Daniel Kesselberg <mail@danielkesselberg.de>
Date: Fri, 31 Jan 2020 16:04:04 +0100
Subject: [PATCH] Make sure to catch php errors during job execution

Signed-off-by: Daniel Kesselberg <mail@danielkesselberg.de>
---
 lib/private/BackgroundJob/Job.php   |  2 +-
 tests/lib/BackgroundJob/JobTest.php | 21 +++++++++++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/lib/private/BackgroundJob/Job.php b/lib/private/BackgroundJob/Job.php
index 8f11ebb4deb..26c69a2486c 100644
--- a/lib/private/BackgroundJob/Job.php
+++ b/lib/private/BackgroundJob/Job.php
@@ -63,7 +63,7 @@ abstract class Job implements IJob {
 
 			$logger->debug('Finished ' . get_class($this) . ' job with ID ' . $this->getId() . ' in ' . $timeTaken . ' seconds', ['app' => 'cron']);
 			$jobList->setExecutionTime($this, $timeTaken);
-		} catch (\Exception $e) {
+		} catch (\Throwable $e) {
 			if ($logger) {
 				$logger->logException($e, [
 					'app' => 'core',
diff --git a/tests/lib/BackgroundJob/JobTest.php b/tests/lib/BackgroundJob/JobTest.php
index 6e5474e597c..b4048aa1c22 100644
--- a/tests/lib/BackgroundJob/JobTest.php
+++ b/tests/lib/BackgroundJob/JobTest.php
@@ -39,6 +39,27 @@ class JobTest extends \Test\TestCase {
 		$this->assertCount(1, $jobList->getAll());
 	}
 
+	public function testRemoveAfterError() {
+		$jobList = new DummyJobList();
+		$job = new TestJob($this, function () {
+			$test = null;
+			$test->someMethod();
+		});
+		$jobList->add($job);
+
+		$logger = $this->getMockBuilder(ILogger::class)
+			->disableOriginalConstructor()
+			->getMock();
+		$logger->expects($this->once())
+			->method('logException')
+			->with($this->isInstanceOf(\Throwable::class));
+
+		$this->assertCount(1, $jobList->getAll());
+		$job->execute($jobList, $logger);
+		$this->assertTrue($this->run);
+		$this->assertCount(1, $jobList->getAll());
+	}
+
 	public function markRun() {
 		$this->run = true;
 	}
-- 
GitLab