diff options
author | Joe Watkins <krakjoe@php.net> | 2019-10-14 16:50:36 +0200 |
---|---|---|
committer | Joe Watkins <krakjoe@php.net> | 2019-10-14 16:50:56 +0200 |
commit | f8e3970ff0cef281312ff524494df863fbd3b76f (patch) | |
tree | 67a208d6bda5a0c9117eb22d8c544671eedbe89f /ext | |
parent | 4e563e6c9505628fec687d0f892573639b249beb (diff) | |
parent | 042e3b227e61742e01aa80a160a68972fd5abfaf (diff) | |
download | php-git-f8e3970ff0cef281312ff524494df863fbd3b76f.tar.gz |
Merge branch 'PHP-7.4'
* PHP-7.4:
Fix checksum calculation for opcache
Diffstat (limited to 'ext')
-rw-r--r-- | ext/opcache/zend_accelerator_util_funcs.c | 14 | ||||
-rw-r--r-- | ext/opcache/zend_accelerator_util_funcs.h | 2 | ||||
-rw-r--r-- | ext/opcache/zend_file_cache.c | 9 |
3 files changed, 14 insertions, 11 deletions
diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index be927f6447..71e98a6bdc 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -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); diff --git a/ext/opcache/zend_accelerator_util_funcs.h b/ext/opcache/zend_accelerator_util_funcs.h index 30531fc2e7..331be541cc 100644 --- a/ext/opcache/zend_accelerator_util_funcs.h +++ b/ext/opcache/zend_accelerator_util_funcs.h @@ -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); diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index 663f511bc1..697bb10b0d 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -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); |