From: Brad Jorsch Date: Fri, 21 Aug 2015 15:48:03 +0000 (-0400) Subject: Unbreak wfResetOutputBuffers X-Git-Tag: 1.31.0-rc.0~10072^2 X-Git-Url: http://git.cyclocoop.org/%28?a=commitdiff_plain;h=8c76a6f0ff0a25145234127b71c2c2124a74d7f0;p=lhc%2Fweb%2Fwiklou.git Unbreak wfResetOutputBuffers Sometime between 5.3 and 5.6, PHP changed from considering the default output buffer (ob_start() or ob_start( null )) as "user" to considering it as "internal", which prevents wfResetOutputBuffers() from removing any buffers. What we really should do here is test directly for whether the buffer can be deleted, using the 'del' flag in PHP 5.3 or 'flags' in PHP 5.4+. As for HHVM, we'll need to continue falling back to testing 'type' for now thanks to https://github.com/facebook/hhvm/issues/5563. Bug: T109842 Change-Id: If0163257a8fb471fd594a3754a20c65274f84a4c --- diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index c3740a0146..e158e5cc40 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -2179,10 +2179,16 @@ function wfResetOutputBuffers( $resetGzipEncoding = true ) { $wgDisableOutputCompression = true; } while ( $status = ob_get_status() ) { - if ( $status['type'] == 0 /* PHP_OUTPUT_HANDLER_INTERNAL */ ) { - // Probably from zlib.output_compression or other - // PHP-internal setting which can't be removed. - // + if ( isset( $status['flags'] ) ) { + $flags = PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_REMOVABLE; + $deleteable = ( $status['flags'] & $flags ) === $flags; + } elseif ( isset( $status['del'] ) ) { + $deleteable = $status['del']; + } else { + // Guess that any PHP-internal setting can't be removed. + $deleteable = $status['type'] !== 0; /* PHP_OUTPUT_HANDLER_INTERNAL */ + } + if ( !$deleteable ) { // Give up, and hope the result doesn't break // output behavior. break;