Make WordPress Core


Ignore:
Timestamp:
08/17/2021 12:14:20 AM (3 years ago)
Author:
SergeyBiryukov
Message:

Code Modernization: Check the return type of parse_url() in download_url().

As per the PHP manual:

If the component parameter is omitted, an associative array is returned.
If the component parameter is specified, parse_url() returns a string (or an int, in the case of PHP_URL_PORT) instead of an array. If the requested component doesn't exist within the given URL, null will be returned.

Reference: PHP Manual: parse_url(): Return Values

This commit adds three unit tests for download_url():

  • The first test is "girl-scouting" to make sure that the code up to the point where the error is expected is tested.
  • The second test exposed a PHP 8.1 basename(): Passing null to parameter #1 ($path) of type string is deprecated error due to the call to parse_url() returning null when the component requested does not exist in the passed URL.
  • The output of the call to parse_url() stored in the $url_path variable is used in more places in the function logic. The third test exposes a second PHP 8.1 deprecation notice, this time for substr(): Passing null to parameter #1 ($string) of type string is deprecated.

This commit also removes duplicate parse_url() calls. Neither $url nor $url_filename are changed between when they are first received/defined and when they are re-used, so there is no need to repeat the function calls.

Follow-up to [51606], [51622].

Props jrf, hellofromTonya, SergeyBiryukov.
See #53635.

File:
1 edited

Legend:

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

    r51300 r51626  
    11271127    }
    11281128
    1129     $url_filename = basename( parse_url( $url, PHP_URL_PATH ) );
     1129    $url_path     = parse_url( $url, PHP_URL_PATH );
     1130    $url_filename = '';
     1131    if ( is_string( $url_path ) && '' !== $url_path ) {
     1132        $url_filename = basename( $url_path );
     1133    }
    11301134
    11311135    $tmpfname = wp_tempnam( $url_filename );
     
    12131217
    12141218            $signature_url = false;
    1215             $url_path      = parse_url( $url, PHP_URL_PATH );
    1216 
    1217             if ( '.zip' === substr( $url_path, -4 ) || '.tar.gz' === substr( $url_path, -7 ) ) {
     1219
     1220            if ( is_string( $url_path ) && ( '.zip' === substr( $url_path, -4 ) || '.tar.gz' === substr( $url_path, -7 ) ) ) {
    12181221                $signature_url = str_replace( $url_path, $url_path . '.sig', $url );
    12191222            }
     
    12441247
    12451248        // Perform the checks.
    1246         $signature_verification = verify_file_signature( $tmpfname, $signature, basename( parse_url( $url, PHP_URL_PATH ) ) );
     1249        $signature_verification = verify_file_signature( $tmpfname, $signature, $url_filename );
    12471250    }
    12481251
Note: See TracChangeset for help on using the changeset viewer.