]> source.dussan.org Git - nextcloud-server.git/commitdiff
fix(themeing): Add error handling to ImageManager 36471/head
authorFerdinand Thiessen <rpm@fthiessen.de>
Mon, 20 Feb 2023 12:10:49 +0000 (13:10 +0100)
committerFerdinand Thiessen <rpm@fthiessen.de>
Mon, 20 Feb 2023 13:57:50 +0000 (14:57 +0100)
Signed-off-by: Ferdinand Thiessen <rpm@fthiessen.de>
apps/theming/lib/ImageManager.php

index fe9c3332f7edd9abe382975e8a22e77d0a92aa34..d088699fd3c37945401e4afde8e26f59e6e44331 100644 (file)
@@ -244,32 +244,50 @@ class ImageManager {
                }
 
                if ($key === 'background' && $this->shouldOptimizeBackgroundImage($detectedMimeType, filesize($tmpFile))) {
-                       // Optimize the image since some people may upload images that will be
-                       // either to big or are not progressive rendering.
-                       $newImage = @imagecreatefromstring(file_get_contents($tmpFile));
-
-                       // Preserve transparency
-                       imagesavealpha($newImage, true);
-                       imagealphablending($newImage, true);
-
-                       $tmpFile = $this->tempManager->getTemporaryFile();
-                       $newWidth = (int)(imagesx($newImage) < 4096 ? imagesx($newImage) : 4096);
-                       $newHeight = (int)(imagesy($newImage) / (imagesx($newImage) / $newWidth));
-                       $outputImage = imagescale($newImage, $newWidth, $newHeight);
-
-                       imageinterlace($outputImage, 1);
-                       if (strpos($detectedMimeType, 'image/jpeg') !== false) {
-                               imagejpeg($outputImage, $tmpFile, 90);
-                       } else {
-                               imagepng($outputImage, $tmpFile, 8);
-                       }
-                       imagedestroy($outputImage);
+                       try {
+                               // Optimize the image since some people may upload images that will be
+                               // either to big or are not progressive rendering.
+                               $newImage = @imagecreatefromstring(file_get_contents($tmpFile));
+                               if ($newImage === false) {
+                                       throw new \Exception('Could not read background image, possibly corrupted.');
+                               }
 
-                       $target->putContent(file_get_contents($tmpFile));
-               } else {
-                       $target->putContent(file_get_contents($tmpFile));
+                               // Preserve transparency
+                               imagesavealpha($newImage, true);
+                               imagealphablending($newImage, true);
+
+                               $newWidth = (int)(imagesx($newImage) < 4096 ? imagesx($newImage) : 4096);
+                               $newHeight = (int)(imagesy($newImage) / (imagesx($newImage) / $newWidth));
+                               $outputImage = imagescale($newImage, $newWidth, $newHeight);
+                               if ($outputImage === false) {
+                                       throw new \Exception('Could not scale uploaded background image.');
+                               }
+
+                               $newTmpFile = $this->tempManager->getTemporaryFile();
+                               imageinterlace($outputImage, 1);
+                               // Keep jpeg images encoded as jpeg
+                               if (strpos($detectedMimeType, 'image/jpeg') !== false) {
+                                       if (!imagejpeg($outputImage, $newTmpFile, 90)) {
+                                               throw new \Exception('Could not recompress background image as JPEG');
+                                       }
+                               } else {
+                                       if (!imagepng($outputImage, $newTmpFile, 8)) {
+                                               throw new \Exception('Could not recompress background image as PNG');
+                                       }
+                               }
+                               $tmpFile = $newTmpFile;
+                               imagedestroy($outputImage);
+                       } catch (\Exception $e) {
+                               if (is_resource($outputImage) || $outputImage instanceof \GdImage) {
+                                       imagedestroy($outputImage);
+                               }
+
+                               $this->logger->debug($e->getMessage());
+                       }
                }
 
+               $target->putContent(file_get_contents($tmpFile));
+
                return $detectedMimeType;
        }