Skip to content

Commit e2a6bf4

Browse files
mhagstrandkrakjoe
authored andcommitted
Fix checksum calculation for opcache
1 parent 900bdcb commit e2a6bf4

File tree

4 files changed

+18
-11
lines changed

4 files changed

+18
-11
lines changed

NEWS

+4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ PHP NEWS
1010
. Fixed bug #78642 (Wrong libiconv version displayed). (gedas at martynas,
1111
cmb).
1212

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

ext/opcache/zend_accelerator_util_funcs.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -735,11 +735,11 @@ zend_op_array* zend_accel_load_script(zend_persistent_script *persistent_script,
735735
#define ADLER32_DO8(buf, i) ADLER32_DO4(buf, i); ADLER32_DO4(buf, i + 4);
736736
#define ADLER32_DO16(buf) ADLER32_DO8(buf, 0); ADLER32_DO8(buf, 8);
737737

738-
unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
738+
unsigned int zend_adler32(unsigned int checksum, unsigned char *buf, uint32_t len)
739739
{
740740
unsigned int s1 = checksum & 0xffff;
741741
unsigned int s2 = (checksum >> 16) & 0xffff;
742-
signed char *end;
742+
unsigned char *end;
743743

744744
while (len >= ADLER32_NMAX) {
745745
len -= ADLER32_NMAX;
@@ -777,15 +777,15 @@ unsigned int zend_adler32(unsigned int checksum, signed char *buf, uint32_t len)
777777

778778
unsigned int zend_accel_script_checksum(zend_persistent_script *persistent_script)
779779
{
780-
signed char *mem = (signed char*)persistent_script->mem;
780+
unsigned char *mem = (unsigned char*)persistent_script->mem;
781781
size_t size = persistent_script->size;
782782
size_t persistent_script_check_block_size = ((char *)&(persistent_script->dynamic_members)) - (char *)persistent_script;
783783
unsigned int checksum = ADLER32_INIT;
784784

785-
if (mem < (signed char*)persistent_script) {
786-
checksum = zend_adler32(checksum, mem, (signed char*)persistent_script - mem);
787-
size -= (signed char*)persistent_script - mem;
788-
mem += (signed char*)persistent_script - mem;
785+
if (mem < (unsigned char*)persistent_script) {
786+
checksum = zend_adler32(checksum, mem, (unsigned char*)persistent_script - mem);
787+
size -= (unsigned char*)persistent_script - mem;
788+
mem += (unsigned char*)persistent_script - mem;
789789
}
790790

791791
zend_adler32(checksum, mem, persistent_script_check_block_size);

ext/opcache/zend_accelerator_util_funcs.h

+1-1
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

+6-3
Original file line numberDiff line numberDiff line change
@@ -868,7 +868,7 @@ int zend_file_cache_script_store(zend_persistent_script *script, int in_shm)
868868
zend_shared_alloc_destroy_xlat_table();
869869

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

873873
#ifdef HAVE_SYS_UIO_H
874874
vec[0].iov_base = &info;
@@ -1371,6 +1371,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
13711371
zend_accel_hash_entry *bucket;
13721372
void *mem, *checkpoint, *buf;
13731373
int cache_it = 1;
1374+
unsigned int actual_checksum;
13741375
int ok;
13751376

13761377
if (!full_path) {
@@ -1458,8 +1459,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
14581459

14591460
/* verify checksum */
14601461
if (ZCG(accel_directives).file_cache_consistency_checks &&
1461-
zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size) != info.checksum) {
1462-
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s'\n", filename);
1462+
(actual_checksum = zend_adler32(ADLER32_INIT, mem, info.mem_size + info.str_size)) != info.checksum) {
1463+
zend_accel_error(ACCEL_LOG_WARNING, "corrupted file '%s' excepted checksum: 0x%08x actual checksum: 0x%08x\n", filename, info.checksum, actual_checksum);
14631464
unlink(filename);
14641465
zend_arena_release(&CG(arena), checkpoint);
14651466
efree(filename);
@@ -1545,6 +1546,8 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
15451546
zend_accel_hash_update(&ZCSG(hash), ZSTR_VAL(script->script.filename), ZSTR_LEN(script->script.filename), 0, script);
15461547

15471548
zend_shared_alloc_unlock();
1549+
zend_accel_error(ACCEL_LOG_INFO, "File cached script loaded into memory '%s'", ZSTR_VAL(script->script.filename));
1550+
15481551
zend_arena_release(&CG(arena), checkpoint);
15491552
}
15501553
efree(filename);

0 commit comments

Comments
 (0)