Make WordPress Core

Ticket #15134: 15134.3.diff

File 15134.3.diff, 3.4 KB (added by costdev, 2 years ago)

Refreshes 15134.2.diff with PHPCS fixes and a slight cleanup of a multi-line condition.

  • src/wp-admin/includes/class-wp-filesystem-direct.php

    diff --git a/src/wp-admin/includes/class-wp-filesystem-direct.php b/src/wp-admin/includes/class-wp-filesystem-direct.php
    index 887ad4e715..b95d04ae94 100644
    a b class WP_Filesystem_Direct extends WP_Filesystem_Base { 
    365365
    366366                $file = str_replace( '\\', '/', $file ); // For Win32, occasional problems deleting files otherwise.
    367367
    368                 if ( 'f' === $type || $this->is_file( $file ) ) {
    369                         return @unlink( $file );
     368                if ( 'f' === $type || $this->is_file( $file ) || $this->is_link( $file ) ) {
     369                        if (
     370                                'WIN' === strtoupper( substr( PHP_OS, 0, 3 ) ) &&
     371                                $this->is_link( $file ) &&
     372                                $this->is_dir( $file )
     373                        ) {
     374                                // on windows unlink()'ing a symlink that points to a directory fails.
     375                                // @link https://bugs.php.net/bug.php?id=52176
     376                                return @rmdir( $file );
     377                        } else {
     378                                // untrailingslashit() needed to remove symlinks successfully.
     379                                return @unlink( untrailingslashit( $file ) );
     380                        }
    370381                }
    371382
    372383                if ( ! $recursive && $this->is_dir( $file ) ) {
    class WP_Filesystem_Direct extends WP_Filesystem_Base { 
    454465                return @is_writable( $file );
    455466        }
    456467
     468        /**
     469         * Checks if a file or directory is a symbolic link.
     470         *
     471         * @since 5.8.0
     472         *
     473         * @param string $file Path to file or directory.
     474         * @return bool Whether $file is a symbolic link.
     475         */
     476        public function is_link( $file ) {
     477                // Strip trailing slashes, to avoid directory symlinks resolving.
     478                return @is_link( untrailingslashit( $file ) );
     479        }
     480
    457481        /**
    458482         * Gets the file's last access time.
    459483         *
    class WP_Filesystem_Direct extends WP_Filesystem_Base { 
    599623         * }
    600624         */
    601625        public function dirlist( $path, $include_hidden = true, $recursive = false ) {
    602                 if ( $this->is_file( $path ) ) {
     626                if ( $this->is_dir( $path ) && $this->is_link( $path ) ) {
     627                        // Directory is symlink, therefore return no listing.
     628                        return array();
     629                } elseif ( $this->is_file( $path ) || $this->is_link( $path ) ) {
    603630                        $limit_file = basename( $path );
    604631                        $path       = dirname( $path );
    605632                } else {
    class WP_Filesystem_Direct extends WP_Filesystem_Base { 
    645672                        $struc['time']        = gmdate( 'h:i:s', $struc['lastmodunix'] );
    646673                        $struc['type']        = $this->is_dir( $path . '/' . $entry ) ? 'd' : 'f';
    647674
    648                         if ( 'd' === $struc['type'] ) {
     675                        if ( 'd' === $struc['type'] && ! $this->is_link( $path . '/' . $struc['name'] ) ) {
    649676                                if ( $recursive ) {
    650677                                        $struc['files'] = $this->dirlist( $path . '/' . $struc['name'], $include_hidden, $recursive );
    651678                                } else {
  • src/wp-admin/includes/class-wp-upgrader.php

    diff --git a/src/wp-admin/includes/class-wp-upgrader.php b/src/wp-admin/includes/class-wp-upgrader.php
    index 9fa6c808a8..7fc26b9eca 100644
    a b class WP_Upgrader { 
    403403                        if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
    404404                                // Attempt to alter permissions to allow writes and try again.
    405405                                $wp_filesystem->chmod( $remote_destination . $filename, ( 'd' === $file_details['type'] ? FS_CHMOD_DIR : FS_CHMOD_FILE ) );
    406                                 if ( ! $wp_filesystem->is_writable( $remote_destination . $filename ) ) {
     406                                // is_writable() returns false on symlinks for some reason.
     407                                if ( ! $wp_filesystem->is_writable( $remote_destination . $filename )
     408                                                && ! $wp_filesystem->is_link( $remote_destination . $filename ) ) {
    407409                                        $unwritable_files[] = $filename;
    408410                                }
    409411                        }