Skip to content

Fix GH-23986: Clear the realpath cache in the child after pcntl_fork() - #23987

Merged
arnaud-lb merged 2 commits into
php:PHP-8.4from
lazerg:fix/gh-23986-realpath-cache-fork
Sep 29, 2026
Merged

arnaud-lb merged 2 commits into
php:PHP-8.4from
lazerg:fix/gh-23986-realpath-cache-fork

Conversation

@lazerg

@lazerg lazerg commented Sep 29, 2026 •

Copy link
Copy Markdown
Contributor

The realpath cache survives fork(), so a path under /proc/self that the parent already resolved stays mapped to the parent's /proc/ in the child. Same goes for /proc/thread-self. The one-entry stat cache has the same problem, e.g. fileinode('/proc/self') in the child returns the parent's inode.

The child now does what clearstatcache(true) does right after the fork, next to the existing zend_max_execution_timer_init() call, in pcntl_fork(), pcntl_rfork() and pcntl_forkx(). I went with clearing in the child rather than skipping /proc paths in the realpath cache, since that would mean special-casing Linux paths in virtual_cwd and still leave the stat cache stale.

Fixes GH-23986

@arnaud-lb
arnaud-lb merged commit 023ee4d into php:PHP-8.4 Sep 29, 2026
18 checks passed
arnaud-lb added a commit that referenced this pull request Sep 29, 2026
* PHP-8.6:
  Fix GH-23986: Clear the realpath cache in the child after pcntl_fork() (#23987)
@arnaud-lb

Copy link
Copy Markdown
Member

Thank you!

pull Bot pushed a commit to dolfly/php-src that referenced this pull request Sep 29, 2026
* PHP-8.4:
  Fix phpGH-23986: Clear the realpath cache in the child after pcntl_fork() (php#23987)
pull Bot pushed a commit to dolfly/php-src that referenced this pull request Sep 29, 2026
* PHP-8.5:
  Fix phpGH-23986: Clear the realpath cache in the child after pcntl_fork() (php#23987)
bukka added a commit to bukka/php-src that referenced this pull request Sep 29, 2026
* upstream/master: (99 commits)
  NEWS
  Fix property hook escape analysis causing misoptimization
  Fix __isset escape analysis causing misoptimization
  Fix memory leak when closing a statement on a killed connection
  Reset field_count for OK packet (php#23890)
  Fix phpGH-23986: Clear the realpath cache in the child after pcntl_fork() (php#23987)
  ext/standard: Remove redundant if-branch in rot13 (php#23795)
  ext/pdo: Throw a ValueError from bindColumn() for an unknown column (php#23835)
  Zend: rename zend_object* parameter to "this_ptr" for zend_call_* functions (php#23989)
  ext/pdo: Release driver options after bindParam and bindColumn
  tests: Raise test stack for stream error depth limit under MSan (php#23985)
  Zend: Remove zend_atomic.[ch] abstraction (php#23927)
  fibers: fix phpGH-23921 (Fibers start with error_reporting = 0 when the error_reporting INI directive is not set)
  ext/pdo: Keep statement class when ATTR_STATEMENT_CLASS is rejected
  Verify bundled sources using CI - Opcache JIT IR (php#20179)
  zend_portability: Simplify definition of `ZEND_NORETURN` (php#23908)
  Fix phpGH-23758: PDO_Firebird returns null for empty BLOBs (php#23763)
  Remove redundant parentheses in session tests (php#23609)
  Update IR (php#23861)
  Fix OSS-Fuzz #552682112: assertion failure wrt zp_arg_must_be_sent_by_ref() (php#23760)
  ...

# Conflicts:
#	ext/openssl/xp_ssl.c
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