Make WordPress Core

Ticket #42619: 42619.2.diff

File 42619.2.diff, 1.6 KB (added by SergeyBiryukov, 2 years ago)
  • src/wp-admin/includes/class-wp-automatic-updater.php

     
    5656        }
    5757
    5858        /**
     59         * Checks whether access to a given directory is allowed.
     60         *
     61         * This is used when detecting version control checkouts. Takes into account
     62         * the PHP open_basedir restrictions, so that WordPress does not try to access
     63         * directories it is not allowed to.
     64         *
     65         * @since 6.1.0
     66         *
     67         * @param string $dir The directory to check.
     68         * @return bool True if access to the directory is allowed, false otherwise.
     69         */
     70        public function is_allowed_dir( $dir ) {
     71                $open_basedir = ini_get( 'open_basedir' );
     72
     73                if ( ! $open_basedir ) {
     74                        return true;
     75                }
     76
     77                $open_basedir_list = explode( PATH_SEPARATOR, $open_basedir );
     78
     79                foreach ( $open_basedir_list as $basedir ) {
     80                        if ( str_starts_with( $dir, $basedir ) ) {
     81                                return true;
     82                        }
     83                }
     84
     85                return false;
     86        }
     87
     88        /**
    5989         * Checks for version control checkouts.
    6090         *
    6191         * Checks for Subversion, Git, Mercurial, and Bazaar. It recursively looks up the
     
    101131                // Search all directories we've found for evidence of version control.
    102132                foreach ( $vcs_dirs as $vcs_dir ) {
    103133                        foreach ( $check_dirs as $check_dir ) {
    104                                 $checkout = @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" );
     134                                $checkout = $this->is_allowed_dir( $check_dir ) && @is_dir( rtrim( $check_dir, '\\/' ) . "/$vcs_dir" );
    105135                                if ( $checkout ) {
    106136                                        break 2;
    107137                                }