Skip to content

Commit 22ac57b

Browse files
committed
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: Fix checksum calculation for opcache
2 parents 7439d48 + e2a6bf4 commit 22ac57b

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
@@ -11,6 +11,10 @@ PHP NEWS
1111
. Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas,
1212
cmb).
1313

14+
- OpCache:
15+
. Fixed bug #78654 (Incorrectly computed opcache checksum on files with
16+
non-ascii characters). (mhagstrand)
17+
1418
- Sockets:
1519
. Fixed bug #78665 (Multicasting may leak memory). (cmb)
1620

ext/opcache/zend_accelerator_util_funcs.c

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

886-
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
886+
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len)
887887
{
888888
unsigned int s1 = checksum & 0xffff;
889889
unsigned int s2 = (checksum >> 16) & 0xffff;
890-
signed char *end;
890+
unsigned char *end;
891891

892892
while (len >= ADLER32_NMAX) {
893893
len -= ADLER32_NMAX;
@@ -925,15 +925,15 @@ unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
925925

926926
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script)
927927
{
928-
signed char *mem = (signed char*)persistent_script->mem;
928+
unsigned char *mem = (unsigned char*)persistent_script->mem;
929929
size_t size = persistent_script->size;
930930
size_t persistent_script_check_block_size = ((char *)&(persistent_script->dynamic_members)) - (char *)persistent_script;
931931
unsigned int checksum = ADLER32_INIT;
932932

933-
if (mem < (signed char*)persistent_script) {
934-
checksum = zend_adler32(checksum, mem, (signed char*)persistent_script - mem);
935-
size -= (signed char*)persistent_script - mem;
936-
mem += (signed char*)persistent_script - mem;
933+
if (mem < (unsigned char*)persistent_script) {
934+
checksum = zend_adler32(checksum, mem, (unsigned char*)persistent_script - mem);
935+
size -= (unsigned char*)persistent_script - mem;
936+
mem += (unsigned char*)persistent_script - mem;
937937
}
938938

939939
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
@@ -37,7 +37,7 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
3737

3838
#define ADLER32_INIT 1 /* initial Adler-32 value */
3939

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

4242
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script);
4343

ext/opcache/zend_file_cache.c

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

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

872872
#ifdef HAVE_SYS_UIO_H
873873
vec[0].iov_base = &info;
@@ -1357,6 +1357,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
13571357
zend_accel_hash_entry *bucket;
13581358
void *mem, *checkpoint, *buf;
13591359
int cache_it = 1;
1360+
unsigned int actual_checksum;
13601361
int ok;
13611362

13621363
if (!full_path) {
@@ -1440,8 +1441,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
14401441

14411442
/* verify checksum */
14421443
if (ZCG(accel_directives).file_cache_consistency_checks &&
1443-
zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size) != info.checksum) {
1444-
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s'\n", filename);
1444+
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
1445+
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n", filename, info.checksum, actual_checksum);
14451446
zend_file_cache_unlink(filename);
14461447
zend_arena_release(&CG(arena), checkpoint);
14471448
efree(filename);
@@ -1527,6 +1528,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
15271528
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(script->script.filename), ZSTR_LEN(script->script.filename), 0, script);
15281529

15291530
zend_shared_alloc_unlock();
1531+
zend_accel_error(ACCEL_LOG_INFO, "File cached script loaded into memory '%s'", ZSTR_VAL(script->script.filename));
1532+
15301533
zend_arena_release(&CG(arena), checkpoint);
15311534
}
15321535
efree(filename);

0 commit comments

Comments
 (0)