1
0
mirror of https://github.com/php/php-src.git synced 2026-04-24 08:28:26 +02:00

Don't allocate temporary file cache memory on arena

During unserialization, static_variables and runtime_cache may be
allocated on the arena, and then later freed when the checkpoint
is released.

As we're only doing a single large allocation here, simply move
this to the normal allocator, so there is no interference with
other arena allocations.
This commit is contained in:
Nikita Popov
2021-04-09 17:06:28 +02:00
parent e0e19fd955
commit 4440ac3ed6
+8 -9
View File
@@ -1705,7 +1705,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
zend_persistent_script *script;
zend_file_cache_metainfo info;
zend_accel_hash_entry *bucket;
void *mem, *checkpoint, *buf;
void *mem, *buf;
int cache_it = 1;
unsigned int actual_checksum;
int ok;
@@ -1766,13 +1766,12 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
return NULL;
}
checkpoint = zend_arena_checkpoint(CG(arena));
#if defined(__AVX__) || defined(__SSE2__)
/* Align to 64-byte boundary */
mem = zend_arena_alloc(&CG(arena), info.mem_size + info.str_size + 64);
mem = emalloc(info.mem_size + info.str_size + 64);
mem = (void*)(((zend_uintptr_t)mem + 63L) & ~63L);
#else
mem = zend_arena_alloc(&CG(arena), info.mem_size + info.str_size);
mem = emalloc(info.mem_size + info.str_size);
#endif
if (read(fd, mem, info.mem_size + info.str_size) != (ssize_t)(info.mem_size + info.str_size)) {
@@ -1780,7 +1779,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
zend_file_cache_flock(fd, LOCK_UN);
close(fd);
zend_file_cache_unlink(filename);
zend_arena_release(&CG(arena), checkpoint);
efree(mem);
efree(filename);
return NULL;
}
@@ -1794,7 +1793,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
(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(mem);
efree(filename);
return NULL;
}
@@ -1814,7 +1813,7 @@ zend_persistent_script *zend_file_cache_script_load(zend_file_handle *file_handl
script = (zend_persistent_script *)bucket->data;
if (!script->corrupted) {
zend_shared_alloc_unlock();
zend_arena_release(&CG(arena), checkpoint);
efree(mem);
efree(filename);
return script;
}
@@ -1864,7 +1863,7 @@ use_process_mem:
zend_shared_alloc_unlock();
goto use_process_mem;
} else {
zend_arena_release(&CG(arena), checkpoint);
efree(mem);
efree(filename);
return NULL;
}
@@ -1882,7 +1881,7 @@ use_process_mem:
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(mem);
}
efree(filename);