Skip to content

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

Closed
labishbardiya wants to merge 2 commits into
php:PHP-8.4from
labishbardiya:fix-gh-24605-var-export-stack-guard
Closed

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

Conversation

@labishbardiya

Copy link
Copy Markdown
Contributor

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.

LamentXU123 added a commit that referenced this pull request Oct 27, 2026
* PHP-8.6:
  Fix GH-24605: Guard var_export() against native stack overflow (#24671)
LamentXU123 added a commit to LamentXU123/php-src that referenced this pull request Oct 27, 2026
* PHP-8.4:
  Fix phpGH-24605: Guard var_export() against native stack overflow (php#24671)
LamentXU123 added a commit to LamentXU123/php-src that referenced this pull request Oct 27, 2026
* PHP-8.5:
  Fix phpGH-24605: Guard var_export() against native stack overflow (php#24671)
arnaud-lb added a commit to prateekbhujel/php-src that referenced this pull request Oct 27, 2026
* PHP-8.4: (26 commits)
  Fix phpGH-24695: FPM tester sends signal to process group when PID is missing (php#24698)
  Fix phpGH-24605: Guard var_export() against native stack overflow (php#24671)
  Fix use-after-free of CURLOPT_STDERR stream on cloned curl handle
  IR: Backport code buffer rollback fix
  Fix SQL test on Windows (php#24755)
  Fix phpGH-24697: cli: passing PHP_HTTP_PARSER_STRICT build option doesn't work
  Fix phpGH-24438: Preserve indirect types in JIT side traces
  Fix phpGH-17733: System entropy does not take into account function order, resulting in wrong functions possibly called in different configurations
  Fix unmapping of an unrelated range when the aligned chunk mmap fails (php#24542)
  Backport: Adapt intl timezone test expectations for ICU 79.1 (php#24724)
  Tracing JIT: keep the SEND_VAL type guard after assigning to a reference
  Backport: Adapt intl timezone test expectations for ICU 79.1 (php#24684)
  ext/zip: Reject broken libzip versions on Windows (php#24371)
  ext/zip: Exclude broken libzip 1.12 (php#24358)
  Fix phpGH-24264: Unwind/GracefulExit discarded in spl_iterators.c
  phpdbg: Backport watchpoint fixes to PHP-8.4
  Fix JIT reading packed-turned-hash array as packed after string key write
  ext/standard: Skip proc_open descriptor 0 tests without /proc/self/fd symlinks
  JIT: Fix operand type check in zend_redo_pass_two_ex() (php#24658)
  Fix error paths in dom_xml_serializing_a_document_node()
  ...
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.

4 participants