From 07b35de70af9692fc7a278f5ca0be0d28f634b27 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 16 Mar 2023 16:14:22 +0000 Subject: [PATCH] Filesystem API: Return `false` for empty paths in FTP `::exists()` methods. When `ftp_nlist()` receives an empty path, it checks the current working directory and may return `true`. This affects: * `WP_Filesystem_FTPext::exists()` * `WP_Filesystem_ftpsockets::exists()` As the purpose of the API is to provide a consistent interface for various filesystem implementations, this commit updates the affected methods to returns `false` when an empty path is provided, bringing consistency with the other filesystem abstraction classes, specifically `WP_Filesystem_Direct` and `WP_Filesystem_SSH2`. Follow-up to [6779], [11821], [25274], [31815]. Props mkox, costdev, Zdrobau, dd32, pbiron, azaozz, mukesh27, SergeyBiryukov. Fixes #33058. Built from https://develop.svn.wordpress.org/trunk@55556 git-svn-id: http://core.svn.wordpress.org/trunk@55068 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/class-wp-filesystem-ftpext.php | 11 +++++++++++ wp-admin/includes/class-wp-filesystem-ftpsockets.php | 11 +++++++++++ wp-includes/version.php | 2 +- 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/wp-admin/includes/class-wp-filesystem-ftpext.php b/wp-admin/includes/class-wp-filesystem-ftpext.php index 975a4dd717..3ce8b67996 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpext.php +++ b/wp-admin/includes/class-wp-filesystem-ftpext.php @@ -419,11 +419,22 @@ class WP_Filesystem_FTPext extends WP_Filesystem_Base { * Checks if a file or directory exists. * * @since 2.5.0 + * @since 6.3.0 Returns false for an empty path. * * @param string $path Path to file or directory. * @return bool Whether $path exists or not. */ public function exists( $path ) { + /* + * Check for empty path. If ftp_nlist() receives an empty path, + * it checks the current working directory and may return true. + * + * See https://core.trac.wordpress.org/ticket/33058. + */ + if ( '' === $path ) { + return false; + } + $list = ftp_nlist( $this->link, $path ); if ( empty( $list ) && $this->is_dir( $path ) ) { diff --git a/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/wp-admin/includes/class-wp-filesystem-ftpsockets.php index da771e4156..1e213ea123 100644 --- a/wp-admin/includes/class-wp-filesystem-ftpsockets.php +++ b/wp-admin/includes/class-wp-filesystem-ftpsockets.php @@ -421,11 +421,22 @@ class WP_Filesystem_ftpsockets extends WP_Filesystem_Base { * Checks if a file or directory exists. * * @since 2.5.0 + * @since 6.3.0 Returns false for an empty path. * * @param string $path Path to file or directory. * @return bool Whether $path exists or not. */ public function exists( $path ) { + /* + * Check for empty path. If ftp::nlist() receives an empty path, + * it checks the current working directory and may return true. + * + * See https://core.trac.wordpress.org/ticket/33058. + */ + if ( '' === $path ) { + return false; + } + $list = $this->ftp->nlist( $path ); if ( empty( $list ) && $this->is_dir( $path ) ) { diff --git a/wp-includes/version.php b/wp-includes/version.php index ef66bfd3de..2d557774ea 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -16,7 +16,7 @@ * * @global string $wp_version */ -$wp_version = '6.3-alpha-55555'; +$wp_version = '6.3-alpha-55556'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.