Sitemaps: Prevent invalid provider names throwing errors.

Validate the requested sitemap is a string before attempting to use it in a provider. This prevents `WP_Sitemaps_Registry::get_provider()` from triggering a fatal error in more recent versions of PHP.

The errors can be triggered by items outside the site owner or developers control (such as a user visiting `?sitemap[foo]=bar`) so the code fails silently to avoid filling error logs with unfixable errors.

Props costdev, dd32.
Fixes #56336.


git-svn-id: https://develop.svn.wordpress.org/trunk@53838 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
Peter Wilson
2022-08-05 05:47:56 +00:00
parent 193444426a
commit b96a51c529
2 changed files with 37 additions and 1 deletions

View File

@@ -65,7 +65,7 @@ class WP_Sitemaps_Registry {
* @return WP_Sitemaps_Provider|null Sitemap provider if it exists, null otherwise.
*/
public function get_provider( $name ) {
if ( ! isset( $this->providers[ $name ] ) ) {
if ( ! is_string( $name ) || ! isset( $this->providers[ $name ] ) ) {
return null;
}

View File

@@ -31,4 +31,40 @@ class Tests_Sitemaps_wpSitemapsRegistry extends WP_UnitTestCase {
$this->assertCount( 1, $providers );
$this->assertSame( $providers['foo'], $provider1, 'Can not confirm sitemap registration is working.' );
}
/**
* Tests that `WP_Sitemaps_Registry::get_provider()` returns `null` when
* the `$name` argument is not a string.
*
* @ticket 56336
*
* @covers WP_Sitemaps_Registry::get_provider
*
* @dataProvider data_get_provider_should_return_null_with_non_string_name
*
* @param mixed $name The non-string name.
*/
public function test_get_provider_should_return_null_with_non_string_name( $name ) {
$registry = new WP_Sitemaps_Registry();
$this->assertNull( $registry->get_provider( $name ) );
}
/**
* Data provider with non-string values.
*
* @return array
*/
public function data_get_provider_should_return_null_with_non_string_name() {
return array(
'array' => array( array() ),
'object' => array( new stdClass() ),
'bool (true)' => array( true ),
'bool (false)' => array( false ),
'null' => array( null ),
'integer (0)' => array( 0 ),
'integer (1)' => array( 1 ),
'float (0.0)' => array( 0.0 ),
'float (1.1)' => array( 1.1 ),
);
}
}