[wp-hackers] possible small bug in widgets.php
Johannes Ruthenberg
tech at johannes-ruthenberg.de
Mon Feb 15 18:10:04 UTC 2010
Hi!
There's a possible bug in wp-includes/widgets.php. Since I don't really
understand all the details I wanted to ask here what everyone else
thinks before opening a trac ticket.
The bug was found in this discussion on the German WordPress forum:
http://forum.wordpress-deutschland.org/konfiguration/62484-error-bei-den-widgets.html
A user got a PHP error when opening the backend widgets page: "Nesting
level too deep – recursive dependency" The error originates in
widgets.php, in function is_active_widget, what is now line 924.
Apparently, you get this message in newer PHP versions (5.2+) when PHP
compares two objects with == instead ob ===. It compares all properties
of the objects, which can lead to a loop if the objects have circular
dependencies. Details for example here:
http://www.richardlord.net/blog/php-nesting-level-too-deep-recursive-dependency
So, line 924 looks like this:
if ( ( $callback && isset($wp_registered_widgets[$widget]['callback'])
&& $wp_registered_widgets[$widget]['callback'] == $callback ) || (
$id_base && _get_widget_id_base($widget) == $id_base ) ) {
The second comparison should be harmless, that would always be a String.
But I'm not really sure what's inside
$wp_registered_widgets[$widget]['callback']. It seems to be an object
which can cause this problem, at least with some widgets. The poster in
above mentioned thread changed both comparisons to === and the PHP error
vanished. Of course, he doesn't want to change this with every WP
upgrade, so I promised to bring this to attention. ;-)
So, do you think I should just open a trac ticket for this? Could the
stricter comparison have possible side effects? As I said, I'm not quite
sure what's actually compared there.
Regards,
Johannes Ruthenberg
More information about the wp-hackers
mailing list