Make WordPress Core

Changeset 57925 for trunk


Ignore:
Timestamp:
04/04/2024 01:54:12 PM (2 years ago)
Author:
swissspidy
Message:

I18N: Bail early if an invalid text domain is passed to load_textdomain() et al.

Some plugins pass invalid values such as null instead of a string, which has never been supported by WordPress (no translations are loaded) and was technically undefined behavior. With the introduction of the new l10n library in #59656, which has stricter type hints, this could end up causing warnings or even fatal errors.

This change adds a deliberate short-circuit to load_textdomain() & co. to better handle such a case and document that it is not supported.

Props verygoode, swissspidy.
Fixes #60888.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/l10n.php

    r57922 r57925  
    729729        $l10n_unloaded = (array) $l10n_unloaded;
    730730
     731        if ( ! is_string( $domain ) ) {
     732                return false;
     733        }
     734
    731735        /**
    732736         * Filters whether to short-circuit loading .mo file.
     
    990994        global $wp_textdomain_registry;
    991995
     996        if ( ! is_string( $domain ) ) {
     997                return false;
     998        }
     999
    9921000        /**
    9931001         * Filters a plugin's locale.
     
    10381046        global $wp_textdomain_registry;
    10391047
     1048        if ( ! is_string( $domain ) ) {
     1049                return false;
     1050        }
     1051
    10401052        /** This filter is documented in wp-includes/l10n.php */
    10411053        $locale = apply_filters( 'plugin_locale', determine_locale(), $domain );
     
    10761088        /** @var WP_Textdomain_Registry $wp_textdomain_registry */
    10771089        global $wp_textdomain_registry;
     1090
     1091        if ( ! is_string( $domain ) ) {
     1092                return false;
     1093        }
    10781094
    10791095        /**
  • trunk/tests/phpunit/tests/l10n/loadTextdomain.php

    r55928 r57925  
    317317                $this->assertSame( 0, $override_load_textdomain_callback->get_call_count(), 'Expected override_load_textdomain not to be called.' );
    318318        }
     319
     320        /**
     321         * @ticket 60888
     322         * @covers ::load_plugin_textdomain
     323         */
     324        public function test_load_plugin_textdomain_invalid_domain() {
     325                $this->assertFalse( load_plugin_textdomain( null ) );
     326        }
     327
     328        /**
     329         * @ticket 60888
     330         * @covers ::load_muplugin_textdomain
     331         */
     332        public function test_load_muplugin_textdomain_invalid_domain() {
     333                $this->assertFalse( load_muplugin_textdomain( null ) );
     334        }
     335
     336        /**
     337         * @ticket 60888
     338         * @covers ::load_theme_textdomain
     339         */
     340        public function test_load_theme_textdomain_invalid_domain() {
     341                $this->assertFalse( load_theme_textdomain( null ) );
     342        }
     343
     344        /**
     345         * @ticket 60888
     346         * @covers ::load_textdomain
     347         */
     348        public function test_load_textdomain_invalid_domain() {
     349                $this->assertFalse( load_textdomain( null, DIR_TESTDATA . '/pomo/thisfiledoesnotexist.mo' ) );
     350        }
    319351}
Note: See TracChangeset for help on using the changeset viewer.