Skip to content

JIT: Fix OP_DATA leak when ASSIGN_DIM fails - #24581

Open
jorgsowa wants to merge 3 commits into
php:PHP-8.4from
jorgsowa:fix-jit-assign-dim-append-leak
Open

jorgsowa wants to merge 3 commits into
php:PHP-8.4from
jorgsowa:fix-jit-assign-dim-append-leak

Conversation

@jorgsowa

Copy link
Copy Markdown
Contributor

Free OP_DATA when appending to a full array, and when converting a float or resource key throws, matching the VM.

@jorgsowa jorgsowa self-assigned this Oct 22, 2026
@jorgsowa
jorgsowa requested a review from dstogov as a code owner October 22, 2026 22:43
Comment thread ext/opcache/tests/jit/assign_dim_019.phpt Outdated
Free OP_DATA when appending to a full array, and when converting a float
or resource key throws, matching the VM.
@jorgsowa
jorgsowa force-pushed the fix-jit-assign-dim-append-leak branch from 329267a to fa6e85c Compare October 23, 2026 09:56

@iliaal iliaal left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please address the inline double-free.

Comment thread ext/opcache/jit/zend_jit_helpers.c Outdated
free_op_data:
if (opline->opcode == ZEND_ASSIGN_DIM
&& ((opline+1)->op1_type & (IS_VAR | IS_TMP_VAR))) {
zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var));

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This helper is also called from zend_jit_assign_dim_helper() after converting false to an array. If float or resource key conversion throws, OP_DATA is freed here and then freed again by the caller's unconditional jit_FREE_OP().

With $a = false; $a[1.5] = new D; and an error handler that suppresses the false-to-array deprecation but throws on the key-conversion warning, the PR head aborts in a debug build and Valgrind reports invalid reads. The base revision completes cleanly.

Please keep OP_DATA ownership with the caller and perform the missing cleanup in the direct generated fetch path. This also needs false-container variants of the float and resource tests.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for catching it. I pushed another commit. Not sure about the new helper approach, whether it's acceptable solution, but it keeps the balance between code size and new instructions.

zend_jit_fetch_dim_w_helper() no longer frees OP_DATA, which
zend_jit_assign_dim_helper() frees again after converting false to an
array. The generated ASSIGN_DIM path selects dedicated fetch and
append-failure helpers at compile time that free OP_DATA, so generated
code size is unchanged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants