[wp-trac] [WordPress Trac] #39338: class-wp-hook.php - apply_filters() infinite loop
WordPress Trac
noreply at wordpress.org
Sat Jan 28 12:48:45 UTC 2017
#39338: class-wp-hook.php - apply_filters() infinite loop
-------------------------------------------+--------------------
Reporter: frettled | Owner:
Type: defect (bug) | Status: new
Priority: normal | Milestone: 4.7.3
Component: Plugins | Version: 4.7
Severity: normal | Resolution:
Keywords: reporter-feedback needs-patch | Focuses:
-------------------------------------------+--------------------
Comment (by gitlost):
`xdebug.so` is only ~1.2M so disk space shouldn't be an issue! Also it's
per-server, not per-WP install. Also if the error is reproducible for you
then you'd only have it install it once you encounter it. Anyway it's an
option to consider next time it happens. It would I think really help to
understand the issue. However...
>The PHP version in question is the latest 5.5 with security patches
backported from 5.6
So you're running some distro's LTS build of PHP? Bit of a red flag, but
probably nothing...though it probably complicates using `Xdebug`.
>we already know where the problem is and how to fix it: don't run
infinite loops. Never!
It's been said before but I'll repeat it:
{{{#!php
<?php
$frettld_doesnt_see = true;
while ( $frettld_doesnt_see ) {
echo "There is no infinite loop unless WP_Hook is in some unstable
condition."
echo "How does WP_Hook get into some unstable condition?"
echo "Nobody knows."
}
}}}
I've been able to semi-reliably put `WP_Hook` into an unstable condition
by getting the max execution time to trigger during the `ksort()` in
`WP_Hook::add_filter()` (using PHP 7.0.13):
{{{#!php
set_time_limit( 1 );
for ( $i = 0; $i < 100000; $i++ ) {
add_action( 'shutdown', '__return_true', $i );
}
}}}
which sometimes leaves the `$this->callbacks` array with duplicate
entries, which then causes PHP warnings (but not infinite) about undefined
offsets and invalid arguments in the inner loop of
`WP_Hook::add_filters()` when it's being run in `shutdown_action_hook()`.
It's an unrealistic scenario of course but it does demonstrate that
`WP_Hook` can be put into an unstable condition "naturally", and that
calling complicated code like `WP_Hook` in the shutdown routine could
cause problems. So it might be worth doing the "shutdown" filters in some
fail-safe manner, perhaps something like the opposite of
`WP_Hook::build_preinitialized_hooks`...
--
Ticket URL: <https://core.trac.wordpress.org/ticket/39338#comment:23>
WordPress Trac <https://core.trac.wordpress.org/>
WordPress publishing platform
More information about the wp-trac
mailing list