[BUGFIX] Temporary filename collision in imageMagickConvert() 73/39373/4
authorMorton Jonuschat <m.jonuschat@mojocode.de>
Fri, 8 May 2015 19:58:02 +0000 (21:58 +0200)
committerMarkus Klein <markus.klein@typo3.org>
Fri, 15 May 2015 12:28:31 +0000 (14:28 +0200)
Add more entropy to the temporary filename used by imageMagickConvert()
to ensure different processing configurations resulting in the same
output dimensions get different temporary names.

In combination with LocalDriver moving the temporary file to a different
location and file_exists_typo3temp_file() having a 30s window where it
doesn't detect the moved file (when the user enabled
$TYPO3_CONF_VARS['GFX']['enable_typo3temp_db_tracking']) this
leads to entries in the sys_processed_file table with a width and
height of 0, thus referencing the original file and resulting in
unscaled images showing in the frontend.

Resolves: #65842
Resolves: #63519
Resolves: #60215
Related: #65378
Releases: 6.2
Change-Id: I42748d0899bf1e24f9f92f2e55802d64309c5704
Reviewed-on: http://review.typo3.org/39373
Reviewed-by: Stephan GroƟberndt <stephan@grossberndt.de>
Reviewed-by: Frans Saris <franssaris@gmail.com>
Reviewed-by: Andreas Fernandez <typo3@scripting-base.de>
Tested-by: Andreas Fernandez <typo3@scripting-base.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
typo3/sysext/core/Classes/Imaging/GraphicalFunctions.php

index 47e6c42..3a3b2ab 100644 (file)
@@ -2245,9 +2245,9 @@ class GraphicalFunctions {
                                $command = $this->scalecmd . ' ' . $info[0] . 'x' . $info[1] . '! ' . $params . ' ';
                                $cropscale = $data['crs'] ? 'crs-V' . $data['cropV'] . 'H' . $data['cropH'] : '';
                                if ($this->alternativeOutputKey) {
-                                       $theOutputName = GeneralUtility::shortMD5($command . $cropscale . basename($imagefile) . $this->alternativeOutputKey . '[' . $frame . ']');
+                                       $theOutputName = GeneralUtility::shortMD5($command . $cropscale . basename($imagefile) . $this->alternativeOutputKey . '[' . $frame . ']' . $w . $h . serialize($params) . serialize($options));
                                } else {
-                                       $theOutputName = GeneralUtility::shortMD5($command . $cropscale . $imagefile . filemtime($imagefile) . '[' . $frame . ']');
+                                       $theOutputName = GeneralUtility::shortMD5($command . $cropscale . $imagefile . filemtime($imagefile) . '[' . $frame . ']' . $w . $h . serialize($params) . serialize($options));
                                }
                                if ($this->imageMagickConvert_forceFileNameBody) {
                                        $theOutputName = $this->imageMagickConvert_forceFileNameBody;