diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index dbc7a37ca079..980bf2d3eaba 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -3659,6 +3659,7 @@ int zend_jit_check_support(void) void zend_jit_startup(void *buf, size_t size, bool reattached) { + ZEND_ASSERT(((uintptr_t)buf & (zend_get_page_size() - 1)) == 0); zend_jit_halt_op = zend_get_halt_op(); zend_jit_profile_counter_rid = zend_get_op_array_extension_handle(ACCELERATOR_PRODUCT_NAME); diff --git a/ext/opcache/shared_alloc_win32.c b/ext/opcache/shared_alloc_win32.c index 5e37cedcb4dd..da6ef8c3db25 100644 --- a/ext/opcache/shared_alloc_win32.c +++ b/ext/opcache/shared_alloc_win32.c @@ -327,7 +327,7 @@ static int create_segments(size_t requested_size, zend_shared_segment ***shared_ } shared_segment->pos = ACCEL_BASE_POINTER_SIZE; - shared_segment->size = requested_size - ACCEL_BASE_POINTER_SIZE; + shared_segment->size = requested_size; zend_shared_alloc_unlock_win32(); diff --git a/ext/opcache/tests/jit/gh25213.phpt b/ext/opcache/tests/jit/gh25213.phpt new file mode 100644 index 000000000000..1ab64b8e08fd --- /dev/null +++ b/ext/opcache/tests/jit/gh25213.phpt @@ -0,0 +1,53 @@ +--TEST-- +GH-25213 (JIT buffer misalignment crashes OPcache when shared memory fills up on Windows) +--EXTENSIONS-- +opcache +--SKIPIF-- + +--INI-- +opcache.enable=1 +opcache.enable_cli=1 +opcache.memory_consumption=16 +opcache.interned_strings_buffer=1 +opcache.max_accelerated_files=20000 +opcache.jit=tracing +opcache.jit_buffer_size=64M +--FILE-- + +--CLEAN-- + +--EXPECT-- +bool(true) +bool(true) +bool(true)