mirror of
https://github.com/php/php-src.git
synced 2025-08-15 21:48:51 +02:00
Merge branch 'PHP-7.4'
* PHP-7.4: Fix checksum calculation for opcache
This commit is contained in:
commit
f8e3970ff0
4 changed files with 18 additions and 11 deletions
4
NEWS
4
NEWS
|
@ -40,6 +40,10 @@ PHP NEWS
|
|||
- mysqlnd:
|
||||
. Fixed #60594 (mysqlnd exposes 160 lines of stats in phpinfo). (PeeHaa)
|
||||
|
||||
- OpCache:
|
||||
. Fixed bug #78654 (Incorrectly computed opcache checksum on files with
|
||||
non-ascii characters). (mhagstrand)
|
||||
|
||||
- PCRE:
|
||||
. Don't ignore invalid escape sequences. (sjon)
|
||||
|
||||
|
|
|
@ -834,11 +834,11 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
|
|||
#define ADLER32_DO8(buf, i) ADLER32_DO4(buf, i); ADLER32_DO4(buf, i + 4);
|
||||
#define ADLER32_DO16(buf) ADLER32_DO8(buf, 0); ADLER32_DO8(buf, 8);
|
||||
|
||||
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
|
||||
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len)
|
||||
{
|
||||
unsigned int s1 = checksum & 0xffff;
|
||||
unsigned int s2 = (checksum >> 16) & 0xffff;
|
||||
signed char *end;
|
||||
unsigned char *end;
|
||||
|
||||
while (len >= ADLER32_NMAX) {
|
||||
len -= ADLER32_NMAX;
|
||||
|
@ -876,15 +876,15 @@ unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
|
|||
|
||||
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script)
|
||||
{
|
||||
signed char *mem = (signed char*)persistent_script->mem;
|
||||
unsigned char *mem = (unsigned char*)persistent_script->mem;
|
||||
size_t size = persistent_script->size;
|
||||
size_t persistent_script_check_block_size = ((char *)&(persistent_script->dynamic_members)) - (char *)persistent_script;
|
||||
unsigned int checksum = ADLER32_INIT;
|
||||
|
||||
if (mem < (signed char*)persistent_script) {
|
||||
checksum = zend_adler32(checksum, mem, (signed char*)persistent_script - mem);
|
||||
size -= (signed char*)persistent_script - mem;
|
||||
mem += (signed char*)persistent_script - mem;
|
||||
if (mem < (unsigned char*)persistent_script) {
|
||||
checksum = zend_adler32(checksum, mem, (unsigned char*)persistent_script - mem);
|
||||
size -= (unsigned char*)persistent_script - mem;
|
||||
mem += (unsigned char*)persistent_script - mem;
|
||||
}
|
||||
|
||||
zend_adler32(checksum, mem, persistent_script_check_block_size);
|
||||
|
|
|
@ -35,7 +35,7 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
|
|||
|
||||
#define ADLER32_INIT 1 /* initial Adler-32 value */
|
||||
|
||||
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len);
|
||||
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len);
|
||||
|
||||
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script);
|
||||
|
||||
|
|
|
@ -936,7 +936,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm)
|
|||
zend_shared_alloc_destroy_xlat_table();
|
||||
|
||||
info.checksum = zend_adler32(ADLER32_INIT, buf, script->size);
|
||||
info.checksum = zend_adler32(info.checksum, (signed char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
|
||||
info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
|
||||
|
||||
#if __has_feature(memory_sanitizer)
|
||||
/* The buffer may contain uninitialized regions. However, the uninitialized parts will not be
|
||||
|
@ -1511,6 +1511,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
|
|||
zend_accel_hash_entry *bucket;
|
||||
void *mem, *checkpoint, *buf;
|
||||
int cache_it = 1;
|
||||
unsigned int actual_checksum;
|
||||
int ok;
|
||||
|
||||
if (!full_path) {
|
||||
|
@ -1594,8 +1595,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
|
|||
|
||||
/* verify checksum */
|
||||
if (ZCG(accel_directives).file_cache_consistency_checks &&
|
||||
zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size) != info.checksum) {
|
||||
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s'\n", filename);
|
||||
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
|
||||
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n", filename, info.checksum, actual_checksum);
|
||||
zend_file_cache_unlink(filename);
|
||||
zend_arena_release(&CG(arena), checkpoint);
|
||||
efree(filename);
|
||||
|
@ -1683,6 +1684,8 @@ use_process_mem:
|
|||
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(script->script.filename), ZSTR_LEN(script->script.filename), 0, script);
|
||||
|
||||
zend_shared_alloc_unlock();
|
||||
zend_accel_error(ACCEL_LOG_INFO, "File cached script loaded into memory '%s'", ZSTR_VAL(script->script.filename));
|
||||
|
||||
zend_arena_release(&CG(arena), checkpoint);
|
||||
}
|
||||
efree(filename);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue