From 66bb6fdbb017b04382cb477944a33b0c83b5bebd Mon Sep 17 00:00:00 2001 From: Elijah Martin-Merrill Date: Mon, 27 Jul 2020 10:52:44 -0400 Subject: [PATCH] fix memory leak caused by not destroying image in Preview/Generate.php Signed-off-by: Elijah Martin-Merrill --- lib/private/Preview/Generator.php | 6 ++++++ tests/lib/Preview/GeneratorTest.php | 5 ++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/private/Preview/Generator.php b/lib/private/Preview/Generator.php index f7aed987d8..45e991d551 100644 --- a/lib/private/Preview/Generator.php +++ b/lib/private/Preview/Generator.php @@ -192,6 +192,12 @@ class Generator { } } + // Free memory being used by the embedded image resource. Without this the image is kept in memory indefinitely. + // Garbage Collection does NOT free this memory. We have to do it ourselves. + if ($maxPreviewImage instanceof IImage) { + $maxPreviewImage->destroy(); + } + return $preview; } diff --git a/tests/lib/Preview/GeneratorTest.php b/tests/lib/Preview/GeneratorTest.php index 3a46447632..5e9b9bcbb8 100644 --- a/tests/lib/Preview/GeneratorTest.php +++ b/tests/lib/Preview/GeneratorTest.php @@ -31,7 +31,6 @@ use OCP\Files\NotFoundException; use OCP\Files\SimpleFS\ISimpleFile; use OCP\Files\SimpleFS\ISimpleFolder; use OCP\IConfig; -use OCP\IImage; use OCP\IPreview; use OCP\Preview\IProviderV2; use Symfony\Component\EventDispatcher\EventDispatcherInterface; @@ -183,7 +182,7 @@ class GeneratorTest extends \Test\TestCase { $this->fail('Unexpected provider requested'); }); - $image = $this->createMock(IImage::class); + $image = $this->createMock(\OC_Image::class); $image->method('width')->willReturn(2048); $image->method('height')->willReturn(2048); $image->method('valid')->willReturn(true); @@ -318,7 +317,7 @@ class GeneratorTest extends \Test\TestCase { } private function getMockImage($width, $height, $data = null) { - $image = $this->createMock(IImage::class); + $image = $this->createMock(\OC_Image::class); $image->method('height')->willReturn($width); $image->method('width')->willReturn($height); $image->method('valid')->willReturn(true);