updated core to 7.65
16
CHANGELOG.txt
Executable file → Normal file
@ -1,3 +1,19 @@
|
||||
Drupal 7.xx, xxxx-xx-xx (development version)
|
||||
-----------------------
|
||||
|
||||
Drupal 7.65, 2019-03-20
|
||||
-----------------------
|
||||
- Fixed security issues:
|
||||
- SA-CORE-2019-004
|
||||
|
||||
Drupal 7.64, 2019-02-06
|
||||
-----------------------
|
||||
- [regression] Unset the 'host' header in drupal_http_request() during redirect
|
||||
- Fixed: 7.x does not have Phar protection and Phar tests are failing on Drupal 7
|
||||
- Fixed: Notice: Undefined index: display_field in file_field_widget_value() (line 582 of /module/file/file.field.inc)
|
||||
- Performance improvement: Registry rebuild should not parse the same file twice in the same request
|
||||
- Fixed _registry_update() to clear caches after transaction is committed
|
||||
|
||||
Drupal 7.63, 2019-01-16
|
||||
-----------------------
|
||||
- Fixed a fatal error for some Drush users introduced by SA-CORE-2019-002.
|
||||
|
0
COPYRIGHT.txt
Executable file → Normal file
0
MAINTAINERS.txt
Executable file → Normal file
0
README.txt
Executable file → Normal file
0
UPGRADE.txt
Executable file → Normal file
0
authorize.php
Executable file → Normal file
0
includes/actions.inc
Executable file → Normal file
0
includes/ajax.inc
Executable file → Normal file
0
includes/archiver.inc
Executable file → Normal file
0
includes/authorize.inc
Executable file → Normal file
0
includes/batch.inc
Executable file → Normal file
0
includes/batch.queue.inc
Executable file → Normal file
2
includes/bootstrap.inc
Executable file → Normal file
@ -8,7 +8,7 @@
|
||||
/**
|
||||
* The current system version.
|
||||
*/
|
||||
define('VERSION', '7.63');
|
||||
define('VERSION', '7.65');
|
||||
|
||||
/**
|
||||
* Core API compatibility.
|
||||
|
0
includes/cache-install.inc
Executable file → Normal file
0
includes/cache.inc
Executable file → Normal file
5
includes/common.inc
Executable file → Normal file
@ -1094,6 +1094,11 @@ function drupal_http_request($url, array $options = array()) {
|
||||
elseif ($options['max_redirects']) {
|
||||
// Redirect to the new location.
|
||||
$options['max_redirects']--;
|
||||
|
||||
// We need to unset the 'Host' header
|
||||
// as we are redirecting to a new location.
|
||||
unset($options['headers']['Host']);
|
||||
|
||||
$result = drupal_http_request($location, $options);
|
||||
$result->redirect_code = $code;
|
||||
}
|
||||
|
0
includes/database/database.inc
Executable file → Normal file
0
includes/database/log.inc
Executable file → Normal file
0
includes/database/mysql/database.inc
Executable file → Normal file
0
includes/database/mysql/install.inc
Executable file → Normal file
0
includes/database/mysql/query.inc
Executable file → Normal file
0
includes/database/mysql/schema.inc
Executable file → Normal file
0
includes/database/pgsql/database.inc
Executable file → Normal file
0
includes/database/pgsql/install.inc
Executable file → Normal file
0
includes/database/pgsql/query.inc
Executable file → Normal file
0
includes/database/pgsql/schema.inc
Executable file → Normal file
0
includes/database/pgsql/select.inc
Executable file → Normal file
0
includes/database/prefetch.inc
Executable file → Normal file
0
includes/database/query.inc
Executable file → Normal file
0
includes/database/schema.inc
Executable file → Normal file
0
includes/database/select.inc
Executable file → Normal file
0
includes/database/sqlite/database.inc
Executable file → Normal file
0
includes/database/sqlite/install.inc
Executable file → Normal file
0
includes/database/sqlite/query.inc
Executable file → Normal file
0
includes/database/sqlite/schema.inc
Executable file → Normal file
0
includes/database/sqlite/select.inc
Executable file → Normal file
0
includes/date.inc
Executable file → Normal file
0
includes/errors.inc
Executable file → Normal file
51
includes/file.inc
Executable file → Normal file
@ -993,8 +993,15 @@ function file_build_uri($path) {
|
||||
* @return
|
||||
* The destination filepath, or FALSE if the file already exists
|
||||
* and FILE_EXISTS_ERROR is specified.
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* Thrown if the filename contains invalid UTF-8.
|
||||
*/
|
||||
function file_destination($destination, $replace) {
|
||||
$basename = drupal_basename($destination);
|
||||
if (!drupal_validate_utf8($basename)) {
|
||||
throw new RuntimeException(sprintf("Invalid filename '%s'", $basename));
|
||||
}
|
||||
if (file_exists($destination)) {
|
||||
switch ($replace) {
|
||||
case FILE_EXISTS_REPLACE:
|
||||
@ -1002,7 +1009,6 @@ function file_destination($destination, $replace) {
|
||||
break;
|
||||
|
||||
case FILE_EXISTS_RENAME:
|
||||
$basename = drupal_basename($destination);
|
||||
$directory = drupal_dirname($destination);
|
||||
$destination = file_create_filename($basename, $directory);
|
||||
break;
|
||||
@ -1218,11 +1224,20 @@ function file_unmunge_filename($filename) {
|
||||
* @return
|
||||
* File path consisting of $directory and a unique filename based off
|
||||
* of $basename.
|
||||
*
|
||||
* @throws RuntimeException
|
||||
* Thrown if the $basename is not valid UTF-8 or another error occurs
|
||||
* stripping control characters.
|
||||
*/
|
||||
function file_create_filename($basename, $directory) {
|
||||
$original = $basename;
|
||||
// Strip control characters (ASCII value < 32). Though these are allowed in
|
||||
// some filesystems, not many applications handle them well.
|
||||
$basename = preg_replace('/[\x00-\x1F]/u', '_', $basename);
|
||||
if (preg_last_error() !== PREG_NO_ERROR) {
|
||||
throw new RuntimeException(sprintf("Invalid filename '%s'", $original));
|
||||
}
|
||||
|
||||
if (substr(PHP_OS, 0, 3) == 'WIN') {
|
||||
// These characters are not allowed in Windows filenames
|
||||
$basename = str_replace(array(':', '*', '?', '"', '<', '>', '|'), '_', $basename);
|
||||
@ -1563,7 +1578,13 @@ function file_save_upload($form_field_name, $validators = array(), $destination
|
||||
if (substr($destination, -1) != '/') {
|
||||
$destination .= '/';
|
||||
}
|
||||
$file->destination = file_destination($destination . $file->filename, $replace);
|
||||
try {
|
||||
$file->destination = file_destination($destination . $file->filename, $replace);
|
||||
}
|
||||
catch (RuntimeException $e) {
|
||||
drupal_set_message(t('The file %source could not be uploaded because the name is invalid.', array('%source' => $form_field_name)), 'error');
|
||||
return FALSE;
|
||||
}
|
||||
// If file_destination() returns FALSE then $replace == FILE_EXISTS_ERROR and
|
||||
// there's an existing file so we need to bail.
|
||||
if ($file->destination === FALSE) {
|
||||
@ -2130,9 +2151,33 @@ function file_download_access($uri) {
|
||||
* 'filename', and 'name' members corresponding to the matching files.
|
||||
*/
|
||||
function file_scan_directory($dir, $mask, $options = array(), $depth = 0) {
|
||||
// Default nomask option.
|
||||
$nomask = '/(\.\.?|CVS)$/';
|
||||
|
||||
// Overrides the $nomask variable accordingly if $options['nomask'] is set.
|
||||
//
|
||||
// Allow directories specified in settings.php to be ignored. You can use this
|
||||
// to not check for files in common special-purpose directories. For example,
|
||||
// node_modules and bower_components. Ignoring irrelevant directories is a
|
||||
// performance boost.
|
||||
if (!isset($options['nomask'])) {
|
||||
$ignore_directories = variable_get(
|
||||
'file_scan_ignore_directories',
|
||||
array()
|
||||
);
|
||||
|
||||
foreach ($ignore_directories as $index => $ignore_directory) {
|
||||
$ignore_directories[$index] = preg_quote($ignore_directory, '/');
|
||||
}
|
||||
|
||||
if (!empty($ignore_directories)) {
|
||||
$nomask = '/^(\.\.?)|CVS|' . implode('|', $ignore_directories) . '$/';
|
||||
}
|
||||
}
|
||||
|
||||
// Merge in defaults.
|
||||
$options += array(
|
||||
'nomask' => '/(\.\.?|CVS)$/',
|
||||
'nomask' => $nomask,
|
||||
'callback' => 0,
|
||||
'recurse' => TRUE,
|
||||
'key' => 'uri',
|
||||
|
0
includes/file.mimetypes.inc
Executable file → Normal file
0
includes/filetransfer/filetransfer.inc
Executable file → Normal file
0
includes/filetransfer/ftp.inc
Executable file → Normal file
0
includes/filetransfer/local.inc
Executable file → Normal file
0
includes/filetransfer/ssh.inc
Executable file → Normal file
0
includes/form.inc
Executable file → Normal file
0
includes/graph.inc
Executable file → Normal file
0
includes/image.inc
Executable file → Normal file
0
includes/install.core.inc
Executable file → Normal file
0
includes/install.inc
Executable file → Normal file
0
includes/iso.inc
Executable file → Normal file
0
includes/json-encode.inc
Executable file → Normal file
0
includes/language.inc
Executable file → Normal file
0
includes/locale.inc
Executable file → Normal file
0
includes/lock.inc
Executable file → Normal file
0
includes/mail.inc
Executable file → Normal file
0
includes/menu.inc
Executable file → Normal file
0
includes/module.inc
Executable file → Normal file
0
includes/pager.inc
Executable file → Normal file
0
includes/password.inc
Executable file → Normal file
0
includes/path.inc
Executable file → Normal file
35
includes/registry.inc
Executable file → Normal file
@ -19,7 +19,6 @@
|
||||
* Does the work for registry_update().
|
||||
*/
|
||||
function _registry_update() {
|
||||
|
||||
// The registry serves as a central autoloader for all classes, including
|
||||
// the database query builders. However, the registry rebuild process
|
||||
// requires write ability to the database, which means having access to the
|
||||
@ -33,6 +32,11 @@ function _registry_update() {
|
||||
require_once DRUPAL_ROOT . '/includes/database/select.inc';
|
||||
require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc';
|
||||
|
||||
// During the first registry rebuild in a request, we check all the files.
|
||||
// During subsequent rebuilds, we only add new files. It makes the rebuilding
|
||||
// process faster during installation of modules.
|
||||
static $check_existing_files = TRUE;
|
||||
|
||||
// Get current list of modules and their files.
|
||||
$modules = db_query("SELECT * FROM {system} WHERE type = 'module'")->fetchAll();
|
||||
// Get the list of files we are going to parse.
|
||||
@ -55,6 +59,9 @@ function _registry_update() {
|
||||
$files["$filename"] = array('module' => '', 'weight' => 0);
|
||||
}
|
||||
|
||||
// Initialize an empty array for the unchanged files.
|
||||
$unchanged_files = array();
|
||||
|
||||
$transaction = db_transaction();
|
||||
try {
|
||||
// Allow modules to manually modify the list of files before the registry
|
||||
@ -63,10 +70,19 @@ function _registry_update() {
|
||||
// list can then be added to the list of files that the registry will parse,
|
||||
// or modify attributes of a file.
|
||||
drupal_alter('registry_files', $files, $modules);
|
||||
|
||||
foreach (registry_get_parsed_files() as $filename => $file) {
|
||||
// Add the hash for those files we have already parsed.
|
||||
if (isset($files[$filename])) {
|
||||
$files[$filename]['hash'] = $file['hash'];
|
||||
if ($check_existing_files === TRUE) {
|
||||
$files[$filename]['hash'] = $file['hash'];
|
||||
}
|
||||
else {
|
||||
// Ignore that file for this request, it has been parsed previously
|
||||
// and it is unlikely it has changed.
|
||||
unset($files[$filename]);
|
||||
$unchanged_files[$filename] = $file;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// Flush the registry of resources in files that are no longer on disc
|
||||
@ -79,8 +95,12 @@ function _registry_update() {
|
||||
->execute();
|
||||
}
|
||||
}
|
||||
|
||||
$parsed_files = _registry_parse_files($files);
|
||||
|
||||
// Add unchanged files to the files.
|
||||
$files += $unchanged_files;
|
||||
|
||||
$unchanged_resources = array();
|
||||
$lookup_cache = array();
|
||||
if ($cache = cache_get('lookup_cache', 'cache_bootstrap')) {
|
||||
@ -89,12 +109,10 @@ function _registry_update() {
|
||||
foreach ($lookup_cache as $key => $file) {
|
||||
// If the file for this cached resource is carried over unchanged from
|
||||
// the last registry build, then we can safely re-cache it.
|
||||
if ($file && in_array($file, array_keys($files)) && !in_array($file, $parsed_files)) {
|
||||
if ($file && isset($files[$file]) && !in_array($file, $parsed_files, TRUE)) {
|
||||
$unchanged_resources[$key] = $file;
|
||||
}
|
||||
}
|
||||
module_implements('', FALSE, TRUE);
|
||||
_registry_check_code(REGISTRY_RESET_LOOKUP_CACHE);
|
||||
}
|
||||
catch (Exception $e) {
|
||||
$transaction->rollback();
|
||||
@ -102,6 +120,13 @@ function _registry_update() {
|
||||
throw $e;
|
||||
}
|
||||
|
||||
module_implements('', FALSE, TRUE);
|
||||
_registry_check_code(REGISTRY_RESET_LOOKUP_CACHE);
|
||||
|
||||
// During the next run in this request, don't bother re-checking existing
|
||||
// files.
|
||||
$check_existing_files = FALSE;
|
||||
|
||||
// We have some unchanged resources, warm up the cache - no need to pay
|
||||
// for looking them up again.
|
||||
if (count($unchanged_resources) > 0) {
|
||||
|
0
includes/session.inc
Executable file → Normal file
0
includes/stream_wrappers.inc
Executable file → Normal file
0
includes/tablesort.inc
Executable file → Normal file
0
includes/theme.inc
Executable file → Normal file
0
includes/theme.maintenance.inc
Executable file → Normal file
0
includes/token.inc
Executable file → Normal file
0
includes/unicode.entities.inc
Executable file → Normal file
0
includes/unicode.inc
Executable file → Normal file
0
includes/update.inc
Executable file → Normal file
0
includes/updater.inc
Executable file → Normal file
0
includes/utility.inc
Executable file → Normal file
0
includes/xmlrpc.inc
Executable file → Normal file
0
includes/xmlrpcs.inc
Executable file → Normal file
0
misc/ajax.js
Executable file → Normal file
0
misc/arrow-asc.png
Executable file → Normal file
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
0
misc/arrow-desc.png
Executable file → Normal file
Before Width: | Height: | Size: 118 B After Width: | Height: | Size: 118 B |
0
misc/authorize.js
Executable file → Normal file
0
misc/autocomplete.js
Executable file → Normal file
0
misc/batch.js
Executable file → Normal file
0
misc/collapse.js
Executable file → Normal file
0
misc/configure.png
Executable file → Normal file
Before Width: | Height: | Size: 248 B After Width: | Height: | Size: 248 B |
0
misc/draggable.png
Executable file → Normal file
Before Width: | Height: | Size: 268 B After Width: | Height: | Size: 268 B |
0
misc/drupal.js
Executable file → Normal file
0
misc/druplicon.png
Executable file → Normal file
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
0
misc/farbtastic/farbtastic.css
Executable file → Normal file
0
misc/farbtastic/farbtastic.js
Executable file → Normal file
0
misc/farbtastic/marker.png
Executable file → Normal file
Before Width: | Height: | Size: 437 B After Width: | Height: | Size: 437 B |
0
misc/farbtastic/mask.png
Executable file → Normal file
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
0
misc/farbtastic/wheel.png
Executable file → Normal file
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
0
misc/favicon.ico
Executable file → Normal file
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
0
misc/feed.png
Executable file → Normal file
Before Width: | Height: | Size: 656 B After Width: | Height: | Size: 656 B |
0
misc/form.js
Executable file → Normal file
0
misc/forum-icons.png
Executable file → Normal file
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
0
misc/grippie.png
Executable file → Normal file
Before Width: | Height: | Size: 106 B After Width: | Height: | Size: 106 B |
0
misc/help.png
Executable file → Normal file
Before Width: | Height: | Size: 294 B After Width: | Height: | Size: 294 B |