WordPress.org

Make WordPress Core


Ignore:
Timestamp:
09/15/2021 10:18:36 PM (5 weeks ago)
Author:
hellofromTonya
Message:

Options, Meta APIs: Fix "passing null to non-nullable" deprecations to (get|add|update|delete)_option().

In all four of the get_option(), add_option(), update_option() and delete_option() functions, the $option parameter (i.e. the option name) is passed to the PHP native trim() function without prior input validation.

In PHP 8.1, this could lead to a trim(): Passing null to parameter #1 ($string) of type string is deprecated for each of these functions.

trim():

  • expects a text string and is only useful when passed a text string as no other variable type can contain whitespace.
  • will always return a string, which means that in practice for any non-string values passed, it would effectively function as a type cast to string.

This commit:

  • Adds a check to verify the $option name is a scalar before processing it with trim().
  • The "type cast" behavior is maintained.
  • If the given $option name is not a scalar, such as null, the fix prevents the PHP 8.1 deprecation notice.
  • Tests are added for valid but undesired option names to safeguard against regressions.

This issue is already covered by:

  • the existing Tests_Option_Option::test_bad_option_names() test group.
  • the new test_valid_but_undesired_option_names() tests.

Follow-up to [13858], [22633], [23510], [25002], [51817].

Props jrf, hellofromTonya, pbearne.
See #53635.

File:
1 edited

Legend:

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

    r51324 r51818  
    7878    global $wpdb;
    7979
    80     $option = trim( $option );
     80    if ( is_scalar( $option ) ) {
     81        $option = trim( $option );
     82    }
     83
    8184    if ( empty( $option ) ) {
    8285        return false;
     
    379382    global $wpdb;
    380383
    381     $option = trim( $option );
     384    if ( is_scalar( $option ) ) {
     385        $option = trim( $option );
     386    }
     387
    382388    if ( empty( $option ) ) {
    383389        return false;
     
    566572    }
    567573
    568     $option = trim( $option );
     574    if ( is_scalar( $option ) ) {
     575        $option = trim( $option );
     576    }
     577
    569578    if ( empty( $option ) ) {
    570579        return false;
     
    688697    global $wpdb;
    689698
    690     $option = trim( $option );
     699    if ( is_scalar( $option ) ) {
     700        $option = trim( $option );
     701    }
     702
    691703    if ( empty( $option ) ) {
    692704        return false;
Note: See TracChangeset for help on using the changeset viewer.