Fixed bug #74663 (Segfault with opcache.memory_protect and validate_timestamp)

This commit is contained in:
Xinchen Hui 2017-05-27 22:42:17 +08:00
parent ece7d223e8
commit 60912e66c8
5 changed files with 42 additions and 1 deletions

4
NEWS
View File

@ -6,6 +6,10 @@ PHP NEWS
. Fixed bug #74658 (Undefined constants in array properties result in broken
properties). (Laruence)
- Opcache:
. Fixed bug #74663 (Segfault with opcache.memory_protect and
validate_timestamp). (Laruence)
- SPL:
. Fixed bug #74478 (null coalescing operator failing with SplFixedArray).
(jhdxr)

View File

@ -957,6 +957,17 @@ int validate_timestamp_and_record(zend_persistent_script *persistent_script, zen
}
}
int validate_timestamp_and_record_ex(zend_persistent_script *persistent_script, zend_file_handle *file_handle)
{
int ret;
SHM_UNPROTECT();
ret = validate_timestamp_and_record(persistent_script, file_handle);
SHM_PROTECT();
return ret;
}
/* Instead of resolving full real path name each time we need to identify file,
* we create a key that consist from requested file name, current working
* directory, current include_path, etc */

View File

@ -331,6 +331,7 @@ void zend_accel_schedule_restart(zend_accel_restart_reason reason);
void zend_accel_schedule_restart_if_necessary(zend_accel_restart_reason reason);
accel_time_t zend_get_file_handle_timestamp(zend_file_handle *file_handle, size_t *size);
int validate_timestamp_and_record(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
int validate_timestamp_and_record_ex(zend_persistent_script *persistent_script, zend_file_handle *file_handle);
int zend_accel_invalidate(const char *filename, int filename_len, zend_bool force);
int zend_accel_script_optimize(zend_persistent_script *persistent_script);
int accelerator_shm_read_lock(void);

View File

@ -0,0 +1,25 @@
--TEST--
Bug #74663 (Segfault with opcache.memory_protect and validate_timestamp)
--INI--
opcache.enable=1
opcache.enable_cli=1
opcache.file_update_protection=0
opcache.enable_file_override=1
opcache.validate_timestamps=1
opcache.revalidate_freq=0
opcache.protect_memory=1
--SKIPIF--
<?php require_once('skipif.inc'); ?>
--FILE--
<?php
$file = __DIR__ . "/bug74663.inc";
file_put_contents($file, "");
include $file;
var_dump(is_file($file));
?>
--CLEAN--
<?php
unlink(__DIR__ . "/bug74663.inc");
--EXPECT--
bool(true)

View File

@ -341,7 +341,7 @@ static int filename_is_in_cache(zend_string *filename)
handle.type = ZEND_HANDLE_FILENAME;
if (ZCG(accel_directives).validate_timestamps) {
return validate_timestamp_and_record(persistent_script, &handle) == SUCCESS;
return validate_timestamp_and_record_ex(persistent_script, &handle) == SUCCESS;
}
return 1;