From afbb9ef0e343fb78f420df688bc495c02e0f91cc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 16 Mar 2023 16:12:51 +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. git-svn-id: https://develop.svn.wordpress.org/trunk@55556 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-wp-filesystem-ftpext.php | 11 +++++++++++ .../includes/class-wp-filesystem-ftpsockets.php | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpext.php b/src/wp-admin/includes/class-wp-filesystem-ftpext.php index 975a4dd717..3ce8b67996 100644 --- a/src/wp-admin/includes/class-wp-filesystem-ftpext.php +++ b/src/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/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php index da771e4156..1e213ea123 100644 --- a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php +++ b/src/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 ) ) {