WordPress.org

Make WordPress Core

Ticket #16057: 16057.htttp.diff

File 16057.htttp.diff, 3.4 KB (added by dd32, 7 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'] ) {