1
0
mirror of https://github.com/processwire/processwire.git synced 2025-08-12 01:34:31 +02:00

Add check for potential race condition in Pageimage.php when multiple requests trying to generate same image variation

This commit is contained in:
Ryan Cramer
2021-07-08 11:33:39 -04:00
parent 64758ebdcc
commit a87e774aaf

View File

@@ -901,9 +901,16 @@ class Pageimage extends Pagefile {
if($sizer->resize($width, $height)) {
if($options['webpAdd'] && $options['webpOnly']) {
if(is_file($filenameUnvalidated)) $files->unlink($filenameUnvalidated);
} else if(!$files->rename($filenameUnvalidated, $filenameFinal)) {
} else {
clearstatcache();
if(!$files->rename($filenameUnvalidated, $filenameFinal)) {
if($files->exists($filenameFinal)) {
// potential race condition: another request won
} else {
$this->error = "Rename failed: $filenameUnvalidated => $filenameFinal";
}
}
}
if($options['webpAdd'] && file_exists($filenameUnvalidatedWebp)) {
$files->rename($filenameUnvalidatedWebp, $filenameFinalWebp);
}
@@ -945,10 +952,10 @@ class Pageimage extends Pagefile {
// if an error occurred, that error property will be populated with details
if($this->error) {
// error condition: unlink copied files
if($filenameFinal && is_file($filenameFinal)) $files->unlink($filenameFinal, true);
if($filenameUnvalidated && is_file($filenameUnvalidated)) $files->unlink($filenameUnvalidated);
if($filenameFinalWebp && is_file($filenameFinalWebp)) $files->unlink($filenameFinalWebp, true);
if($filenameUnvalidatedWebp && is_file($filenameUnvalidatedWebp)) $files->unlink($filenameUnvalidatedWebp);
if($filenameFinal && $files->exists($filenameFinal)) $files->unlink($filenameFinal, true);
if($filenameUnvalidated && $files->exists($filenameUnvalidated)) $files->unlink($filenameUnvalidated);
if($filenameFinalWebp && $files->exists($filenameFinalWebp)) $files->unlink($filenameFinalWebp, true);
if($filenameUnvalidatedWebp && $files->exists($filenameUnvalidatedWebp)) $files->unlink($filenameUnvalidatedWebp);
// we also tell PW about it for logging and/or admin purposes
$this->error($this->error);