WordPress.org

Make WordPress Core

Ticket #16057: 16057.htttp.diff

File 16057.htttp.diff, 3.4 KB (added by dd32, 3 years ago)
  • wp-includes/class-http.php

     
    681681                        if ( ! $stream_handle ) 
    682682                                return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); 
    683683 
     684                        $bytes_written = 0; 
     685 
    684686                        while ( ! feof($handle) ) { 
    685687                                $block = fread( $handle, 4096 ); 
    686688                                if ( $bodyStarted ) { 
    687                                         fwrite( $stream_handle, $block ); 
     689                                        $bytes_written += fwrite( $stream_handle, $block ); 
    688690                                } else { 
    689691                                        $strResponse .= $block; 
    690692                                        if ( strpos( $strResponse, "\r\n\r\n" ) ) { 
    691693                                                $process = WP_Http::processResponse( $strResponse ); 
    692694                                                $bodyStarted = true; 
    693                                                 fwrite( $stream_handle, $process['body'] ); 
     695                                                $bytes_written += fwrite( $stream_handle, $process['body'] ); 
    694696                                                unset( $strResponse ); 
    695697                                                $process['body'] = ''; 
    696698                                        } 
     
    714716 
    715717                $arrHeaders = WP_Http::processHeaders( $process['headers'] ); 
    716718 
     719                //Check the file was fully written to disk 
     720                if ( $r['stream'] && isset( $arrHeaders['headers']['content-length'] ) && (int)$arrHeaders['headers']['content-length'] > $bytes_written ) { 
     721                        unlink($r['filename']); 
     722                        return new WP_Error('http_request_failed', __('Failed to write full file to disk.') ); 
     723                } 
     724 
    717725                // If location is found, then assume redirect and redirect to location. 
    718726                if ( isset($arrHeaders['headers']['location']) && 0 !== $r['_redirection'] ) { 
    719727                        if ( $r['redirection']-- > 0 ) { 
     
    882890                        if ( ! $stream_handle ) 
    883891                                return new WP_Error( 'http_request_failed', sprintf( __( 'Could not open handle for fopen() to %s' ), $r['filename'] ) ); 
    884892 
    885                         stream_copy_to_stream( $handle, $stream_handle ); 
     893                        $bytes_written = stream_copy_to_stream( $handle, $stream_handle ); 
    886894 
    887895                        fclose( $stream_handle ); 
    888896                        $strResponse = ''; 
     
    900908                else 
    901909                        $processedHeaders = WP_Http::processHeaders($meta['wrapper_data']); 
    902910 
     911                //Check the file was fully written to disk 
     912                if ( $r['stream'] && isset( $processedHeaders['headers']['content-length'] ) ) { 
     913                        if ( (int)$processedHeaders['headers']['content-length'] > $bytes_written && ! ( $bytes_written === 1 && 0 === (int)$processedHeaders['headers']['content-length'] ) ) { // PHP Bug: http://bugs.php.net/bug.php?id=47997 fixed in 5.2.10 
     914                                unlink($r['filename']); 
     915                                return new WP_Error('http_request_failed', __('Failed to write full file to disk.') ); 
     916                        } 
     917                } 
     918 
    903919                // Streams does not provide an error code which we can use to see why the request stream stoped. 
    904920                // We can however test to see if a location header is present and return based on that. 
    905921                if ( isset($processedHeaders['headers']['location']) && 0 !== $args['_redirection'] ) 
     
    11101126 
    11111127                curl_close( $handle ); 
    11121128 
    1113                 if ( $r['stream'] ) 
     1129                if ( $r['stream'] ) { 
    11141130                        fclose( $stream_handle ); 
     1131                        // Check the file was fully written to disk 
     1132                        if ( isset( $theHeaders['headers']['content-length'] ) && (int)$theHeaders['headers']['content-length'] > filesize( $r['filename'] ) ) { 
     1133                                unlink($r['filename']); 
     1134                                return new WP_Error( 'http_request_failed', __('Failed to write full file to disk.' ) ); 
     1135                        } 
     1136                } 
    11151137 
    11161138                // See #11305 - When running under safe mode, redirection is disabled above. Handle it manually. 
    11171139                if ( ! empty( $theHeaders['headers']['location'] ) && ( ini_get( 'safe_mode' ) || ini_get( 'open_basedir' ) ) && 0 !== $r['_redirection'] ) {