From dbaee6b5504cbb6f23402a37a4f70d51fb6f185e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 16 Feb 2021 18:42:03 +0000 Subject: [PATCH] Filesystem API: Make sure to only call `fread()` on non-empty files in the PclZip library. This avoids a fatal error on PHP 8 caused by passing a zero value to `fread()` as the `$length` argument, which must be greater than zero. Props yakimun, fierevere, jrf, DavidAnderson, SergeyBiryukov. Fixes #52018. Built from https://develop.svn.wordpress.org/trunk@50355 git-svn-id: http://core.svn.wordpress.org/trunk@49966 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/includes/class-pclzip.php | 35 +++++++++++++++++++++++++----- wp-includes/version.php | 2 +- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/wp-admin/includes/class-pclzip.php b/wp-admin/includes/class-pclzip.php index 8a085f8bd0..b8f2fdca86 100644 --- a/wp-admin/includes/class-pclzip.php +++ b/wp-admin/includes/class-pclzip.php @@ -3884,7 +3884,12 @@ // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + if ( $p_entry['compressed_size'] > 0 ) { + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + $v_buffer = false; + } // ----- Decompress the file $v_file_content = @gzinflate($v_buffer); @@ -4096,7 +4101,12 @@ if ($p_entry['compressed_size'] == $p_entry['size']) { // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + if ( $p_entry['compressed_size'] > 0 ) { + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + $v_buffer = false; + } // ----- Send the file to the output echo $v_buffer; @@ -4105,7 +4115,12 @@ else { // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + if ( $p_entry['compressed_size'] > 0 ) { + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + $v_buffer = false; + } // ----- Decompress the file $v_file_content = gzinflate($v_buffer); @@ -4209,12 +4224,22 @@ if ($p_entry['compression'] == 0) { // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + if ( $p_entry['compressed_size'] > 0 ) { + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + $p_string = false; + } } else { // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + if ( $p_entry['compressed_size'] > 0 ) { + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + } + else { + $v_data = false; + } // ----- Decompress the file if (($p_string = @gzinflate($v_data)) === FALSE) { diff --git a/wp-includes/version.php b/wp-includes/version.php index 26898b4bf9..1ddf7bd6c7 100644 --- a/wp-includes/version.php +++ b/wp-includes/version.php @@ -13,7 +13,7 @@ * * @global string $wp_version */ -$wp_version = '5.7-beta2-50354'; +$wp_version = '5.7-beta2-50355'; /** * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.