X-Git-Url: http://aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Flib%2FDrupal%2FComponent%2FPhpStorage%2FFileStorage.php;h=63b3cbe3b6cad9512882ae3712fbcdf0f5db1d0a;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hp=e82ec2d6dd85e7ef2d5580b28cbc42ba011ae521;hpb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;p=yaffs-website diff --git a/web/core/lib/Drupal/Component/PhpStorage/FileStorage.php b/web/core/lib/Drupal/Component/PhpStorage/FileStorage.php index e82ec2d6d..63b3cbe3b 100644 --- a/web/core/lib/Drupal/Component/PhpStorage/FileStorage.php +++ b/web/core/lib/Drupal/Component/PhpStorage/FileStorage.php @@ -138,34 +138,42 @@ EOF; * The directory path. * @param int $mode * The mode, permissions, the directory should have. - * @param bool $is_backwards_recursive - * Internal use only. * * @return bool * TRUE if the directory exists or has been created, FALSE otherwise. */ - protected function createDirectory($directory, $mode = 0777, $is_backwards_recursive = FALSE) { + protected function createDirectory($directory, $mode = 0777) { // If the directory exists already, there's nothing to do. if (is_dir($directory)) { return TRUE; } - // Otherwise, try to create the directory and ensure to set its permissions, - // because mkdir() obeys the umask of the current process. - if (is_dir($parent = dirname($directory))) { - // If the parent directory exists, then the backwards recursion must end, - // regardless of whether the subdirectory could be created. - if ($status = mkdir($directory)) { - // Only try to chmod() if the subdirectory could be created. - $status = chmod($directory, $mode); + + // If the parent directory doesn't exist, try to create it. + $parent_exists = is_dir($parent = dirname($directory)); + if (!$parent_exists) { + $parent_exists = $this->createDirectory($parent, $mode); + } + + // If parent exists, try to create the directory and ensure to set its + // permissions, because mkdir() obeys the umask of the current process. + if ($parent_exists) { + // We hide warnings and ignore the return because there may have been a + // race getting here and the directory could already exist. + @mkdir($directory); + // Only try to chmod() if the subdirectory could be created. + if (is_dir($directory)) { + // Avoid writing permissions if possible. + if (fileperms($directory) !== $mode) { + return chmod($directory, $mode); + } + return TRUE; + } + else { + // Something failed and the directory doesn't exist. + trigger_error('mkdir(): Permission Denied', E_USER_WARNING); } - return $is_backwards_recursive ? TRUE : $status; } - // If the parent directory and the requested directory does not exist and - // could not be created above, walk the requested directory path back up - // until an existing directory is hit, and from there, recursively create - // the sub-directories. Only if that recursion succeeds, create the final, - // originally requested subdirectory. - return $this->createDirectory($parent, $mode, TRUE) && mkdir($directory) && chmod($directory, $mode); + return FALSE; } /**