From 5c9ddcc052cb95c6bb1ae64e5bb36a3564414442 Mon Sep 17 00:00:00 2001 From: Thomas Bruederli Date: Mon, 3 Nov 2014 15:49:49 +0100 Subject: Check available memory for image resizing with GD on Windows (#1489937) --- program/lib/Roundcube/rcube_image.php | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'program/lib/Roundcube') diff --git a/program/lib/Roundcube/rcube_image.php b/program/lib/Roundcube/rcube_image.php index 77ce1647d..9c9f08b53 100644 --- a/program/lib/Roundcube/rcube_image.php +++ b/program/lib/Roundcube/rcube_image.php @@ -59,11 +59,13 @@ class rcube_image $height = $imsize[1]; $gd_type = $imsize['2']; $type = image_type_to_extension($imsize['2'], false); + $channels = $imsize['channels']; } // use ImageMagick if (!$type && ($data = $this->identify())) { list($type, $width, $height) = $data; + $channels = null; } if ($type) { @@ -72,8 +74,11 @@ class rcube_image 'gd_type' => $gd_type, 'width' => $width, 'height' => $height, + 'channels' => $channels, ); } + + return null; } /** @@ -181,6 +186,11 @@ class rcube_image } } + // do we have enough memory? (#1489937) + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && !$this->mem_check($props)) { + return false; + } + // use GD extension if ($props['gd_type']) { if ($props['gd_type'] == IMAGETYPE_JPEG && function_exists('imagecreatefromjpeg')) { @@ -327,6 +337,12 @@ class rcube_image // use GD extension (TIFF isn't supported) $props = $this->props(); + // do we have enough memory? (#1489937) + if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN' && !$this->mem_check($props)) { + return false; + } + + if ($props['gd_type']) { if ($props['gd_type'] == IMAGETYPE_JPEG && function_exists('imagecreatefromjpeg')) { $image = imagecreatefromjpeg($this->image_file); @@ -406,4 +422,22 @@ class rcube_image catch (Exception $e) {} } } + + /** + * Check if we have enough memory to load specified image + */ + private function mem_check($props) + { + // image size is unknown, we can't calculate required memory + if (!$props['width']) { + return true; + } + + // channels: CMYK - 4, RGB - 3 + $multip = ($props['channels'] ?: 3) + 1; + + // calculate image size in memory (in bytes) + $size = $props['width'] * $props['height'] * $multip; + return rcube_utils::mem_check($size); + } } -- cgit v1.2.3