Skip to content

Commit 042e3b2

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fix checksum calculation for opcache
2 parents 641f961 + 22ac57b commit 042e3b2

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ PHP NEWS
3030
. Fixed bug #76809 (SSL settings aren't respected when persistent connections
3131
are used). (fabiomsouto)
3232

33+
- OpCache:
34+
. Fixed bug #78654 (Incorrectly computed opcache checksum on files with
35+
non-ascii characters). (mhagstrand)
36+
3337
- PDO_MySQL:
3438
. Fixed bug #78623 (Regression caused by "SP call yields additional empty
3539
result set"). (cmb)

ext/opcache/zend_accelerator_util_funcs.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -834,11 +834,11 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
834834
#define ADLER32_DO8(buf, i) ADLER32_DO4(buf, i); ADLER32_DO4(buf, i + 4);
835835
#define ADLER32_DO16(buf) ADLER32_DO8(buf, 0); ADLER32_DO8(buf, 8);
836836

837-
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
837+
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len)
838838
{
839839
unsigned int s1 = checksum & 0xffff;
840840
unsigned int s2 = (checksum >> 16) & 0xffff;
841-
signed char *end;
841+
unsigned char *end;
842842

843843
while (len >= ADLER32_NMAX) {
844844
len -= ADLER32_NMAX;
@@ -876,15 +876,15 @@ unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
876876

877877
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script)
878878
{
879-
signed char *mem = (signed char*)persistent_script->mem;
879+
unsigned char *mem = (unsigned char*)persistent_script->mem;
880880
size_t size = persistent_script->size;
881881
size_t persistent_script_check_block_size = ((char *)&(persistent_script->dynamic_members)) - (char *)persistent_script;
882882
unsigned int checksum = ADLER32_INIT;
883883

884-
if (mem < (signed char*)persistent_script) {
885-
checksum = zend_adler32(checksum, mem, (signed char*)persistent_script - mem);
886-
size -= (signed char*)persistent_script - mem;
887-
mem += (signed char*)persistent_script - mem;
884+
if (mem < (unsigned char*)persistent_script) {
885+
checksum = zend_adler32(checksum, mem, (unsigned char*)persistent_script - mem);
886+
size -= (unsigned char*)persistent_script - mem;
887+
mem += (unsigned char*)persistent_script - mem;
888888
}
889889

890890
zend_adler32(checksum, mem, persistent_script_check_block_size);

ext/opcache/zend_accelerator_util_funcs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
3535

3636
#define ADLER32_INIT 1 /* initial Adler-32 value */
3737

38-
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len);
38+
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len);
3939

4040
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script);
4141

ext/opcache/zend_file_cache.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -929,7 +929,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm)
929929
zend_shared_alloc_destroy_xlat_table();
930930

931931
info.checksum = zend_adler32(ADLER32_INIT, buf, script->size);
932-
info.checksum = zend_adler32(info.checksum, (signed char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
932+
info.checksum = zend_adler32(info.checksum, (unsigned char*)ZSTR_VAL((zend_string*)ZCG(mem)), info.str_size);
933933

934934
#if __has_feature(memory_sanitizer)
935935
/* The buffer may contain uninitialized regions. However, the uninitialized parts will not be
@@ -1504,6 +1504,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
15041504
zend_accel_hash_entry *bucket;
15051505
void *mem, *checkpoint, *buf;
15061506
int cache_it = 1;
1507+
unsigned int actual_checksum;
15071508
int ok;
15081509

15091510
if (!full_path) {
@@ -1587,8 +1588,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
15871588

15881589
/* verify checksum */
15891590
if (ZCG(accel_directives).file_cache_consistency_checks &&
1590-
zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size) != info.checksum) {
1591-
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s'\n", filename);
1591+
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
1592+
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n", filename, info.checksum, actual_checksum);
15921593
zend_file_cache_unlink(filename);
15931594
zend_arena_release(&CG(arena), checkpoint);
15941595
efree(filename);
@@ -1676,6 +1677,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
16761677
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(script->script.filename), ZSTR_LEN(script->script.filename), 0, script);
16771678

16781679
zend_shared_alloc_unlock();
1680+
zend_accel_error(ACCEL_LOG_INFO, "File cached script loaded into memory '%s'", ZSTR_VAL(script->script.filename));
1681+
16791682
zend_arena_release(&CG(arena), checkpoint);
16801683
}
16811684
efree(filename);

0 commit comments

Comments
 (0)