diff -upr drupal-7.9/includes/file.inc drupal-7.9-patched-is-writable/includes/file.inc --- drupal-7.9/includes/file.inc 2011-11-07 21:34:27.282166217 +0400 +++ drupal-7.9-patched-is-writable/includes/file.inc 2011-11-07 22:05:45.247478554 +0400 @@ -450,7 +450,7 @@ function file_prepare_directory(&$direct return FALSE; } // The directory exists, so check to see if it is writable. - $writable = is_writable($directory); + $writable = drupal_is_writable($directory); if (!$writable && ($options & FILE_MODIFY_PERMISSIONS)) { return drupal_chmod($directory); } @@ -2404,7 +2404,7 @@ function file_directory_temp() { } foreach ($directories as $directory) { - if (is_dir($directory) && is_writable($directory)) { + if (is_dir($directory) && drupal_is_writable($directory)) { $temporary_directory = $directory; break; } @@ -2459,3 +2459,24 @@ function file_get_content_headers($file) /** * @} End of "defgroup file". */ + +function drupal_is_writable($path) { + //NOTE: use a trailing slash for folders!!! + if ($path{strlen($path)-1} == '/') { // recursively return a temporary file path + return drupal_is_writable($path.uniqid(mt_rand()).'.tmp'); + } elseif (is_dir($path)) { + return drupal_is_writable($path.'/'.uniqid(mt_rand()).'.tmp'); + } + + // check tmp file for read/write capabilities + $rm = file_exists($path); + $f = @fopen($path, 'a'); + if ($f === FALSE) { + return FALSE; + } + fclose($f); + if (!$rm) { + unlink($path); + } + return TRUE; +} diff -upr drupal-7.9/includes/install.inc drupal-7.9-patched-is-writable/includes/install.inc --- drupal-7.9/includes/install.inc 2011-11-07 21:34:27.274166178 +0400 +++ drupal-7.9-patched-is-writable/includes/install.inc 2011-11-07 21:43:43.400923861 +0400 @@ -847,7 +847,7 @@ function drupal_verify_install_file($fil } break; case FILE_WRITABLE: - if (!is_writable($file) && !drupal_install_fix_file($file, $mask)) { + if (!drupal_is_writable($file) && !drupal_install_fix_file($file, $mask)) { $return = FALSE; } break; @@ -862,7 +862,7 @@ function drupal_verify_install_file($fil } break; case FILE_NOT_WRITABLE: - if (is_writable($file) && !drupal_install_fix_file($file, $mask)) { + if (drupal_is_writable($file) && !drupal_install_fix_file($file, $mask)) { $return = FALSE; } break; @@ -960,7 +960,7 @@ function drupal_install_fix_file($file, } break; case FILE_WRITABLE: - if (!is_writable($file)) { + if (!drupal_is_writable($file)) { $mod |= 0222; } break; @@ -975,7 +975,7 @@ function drupal_install_fix_file($file, } break; case FILE_NOT_WRITABLE: - if (is_writable($file)) { + if (drupal_is_writable($file)) { $mod &= ~0222; } break; diff -upr drupal-7.9/includes/updater.inc drupal-7.9-patched-is-writable/includes/updater.inc --- drupal-7.9/includes/updater.inc 2011-11-07 21:34:27.274166178 +0400 +++ drupal-7.9-patched-is-writable/includes/updater.inc 2011-11-07 21:43:56.900990802 +0400 @@ -309,7 +309,7 @@ class Updater { // Make the parent dir writable if need be and create the dir. if (!is_dir($directory)) { $parent_dir = dirname($directory); - if (!is_writable($parent_dir)) { + if (!drupal_is_writable($parent_dir)) { @chmod($parent_dir, 0755); // It is expected that this will fail if the directory is owned by the // FTP user. If the FTP user == web server, it will succeed. diff -upr drupal-7.9/modules/system/system.admin.inc drupal-7.9-patched-is-writable/modules/system/system.admin.inc --- drupal-7.9/modules/system/system.admin.inc 2011-11-07 21:34:27.698168270 +0400 +++ drupal-7.9-patched-is-writable/modules/system/system.admin.inc 2011-11-07 21:44:33.785173700 +0400 @@ -1674,7 +1674,7 @@ function system_performance_settings() { ); $directory = 'public://'; - $is_writable = is_dir($directory) && is_writable($directory); + $is_writable = is_dir($directory) && drupal_is_writable($directory); $disabled = !$is_writable; $disabled_message = ''; if (!$is_writable) { diff -upr drupal-7.9/modules/system/system.module drupal-7.9-patched-is-writable/modules/system/system.module --- drupal-7.9/modules/system/system.module 2011-11-07 21:34:27.694168262 +0400 +++ drupal-7.9-patched-is-writable/modules/system/system.module 2011-11-07 21:44:44.913228881 +0400 @@ -2156,7 +2156,7 @@ function system_check_directory($form_el watchdog('file system', 'The directory %directory does not exist and could not be created.', array('%directory' => $directory), WATCHDOG_ERROR); } - if (is_dir($directory) && !is_writable($directory) && !drupal_chmod($directory)) { + if (is_dir($directory) && !drupal_is_writable($directory) && !drupal_chmod($directory)) { // If the directory is not writable and cannot be made so. form_set_error($form_element['#parents'][0], t('The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory))); watchdog('file system', 'The directory %directory exists but is not writable and could not be made writable.', array('%directory' => $directory), WATCHDOG_ERROR);