Skip to content

Guard var_export() against native stack overflow (GH-24605) - #24671

Open
labishbardiya wants to merge 1 commit into
php:PHP-8.4from
labishbardiya:fix-gh-24605-var-export-stack-guard
Open

labishbardiya wants to merge 1 commit into
php:PHP-8.4from
labishbardiya:fix-gh-24605-var-export-stack-guard

Conversation

@labishbardiya

Copy link
Copy Markdown

Summary

Add native stack overflow protection to var_export() so deeply nested arrays and objects raise a catchable Error instead of risking a segmentation fault.

Refs GH-24605.

Root cause

php_var_export_ex() recursively processes nested structures without checking the native stack limit.

Other recursive PHP operations already use Zend's stack-limit protection.

Changes

  • Add the native stack-limit guard to php_var_export_ex().
  • Return FAILURE when the stack limit is exceeded.
  • Propagate failures from recursive object property exports.
  • Preserve cleanup on failure paths.
  • Add a PHPT regression test for deeply nested arrays and objects.

Validation

Environment: macOS ARM64, PHP 8.4.28-dev, debug build.

The unrelated unexpected failure occurred in php_ini_loaded_file.phpt. It is caused by inherited -c configuration arguments from the test harness.

The same test passes when run without those arguments. A correction is already proposed in PHP PR #24406.

The full suite has therefore not been demonstrated to pass without unexpected failures under the standard make test invocation.

Scope

This change addresses only the var_export() portion of GH-24605.

The print_r() and unserialize() cases remain outside this PR's scope.

@labishbardiya
labishbardiya requested a review from bukka as a code owner October 25, 2026 07:15
Copilot AI balanced review requested due to automatic review settings October 25, 2026 07:15

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@ndossche ndossche 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.

Thanks
For the test: I think that either increasing the nesting level from 3000 to something slightly higher, or lowering the max_allowed_stack_size would make the test more robust.

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.

3 participants