diff options
Diffstat (limited to 'install-utils.inc')
-rw-r--r-- | install-utils.inc | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/install-utils.inc b/install-utils.inc index ab8e15dc..36465b64 100644 --- a/install-utils.inc +++ b/install-utils.inc @@ -33,6 +33,26 @@ function install_version_checks() { "or higher. ABORTING. (http://bugs.php.net/bug.php?id=34879 for details)\n"; die( -1 ); } + + $test = new PhpXmlBugTester(); + if( !$test->ok ) { + echo "Your system has a combination of PHP and libxml2 versions which is buggy\n" . + "and can cause hidden data corruption in MediaWiki and other web apps.\n" . + "Upgrade to PHP 5.2.9 or later and libxml2 2.7.3 or later!\n" . + "ABORTING (http://bugs.php.net/bug.php?id=45996 for details).\n"; + die( -1 ); + } + + + $test = new PhpRefCallBugTester; + $test->execute(); + if ( !$test->ok ) { + echo "PHP 5.3.1 is not compatible with MediaWiki due to a bug involving\n" . + "reference parameters to __call. Upgrade to PHP 5.3.2 or higher, or \n" . + "downgrade to PHP 5.3.0 to fix this.\n" . + "ABORTING (see http://bugs.php.net/bug.php?id=50394 for details)\n"; + die( -1 ); + } global $wgCommandLineMode; $wgCommandLineMode = true; @@ -69,6 +89,52 @@ function copydirectory( $source, $dest ) { } } +/** + * Test for PHP+libxml2 bug which breaks XML input subtly with certain versions. + * http://bugs.php.net/bug.php?id=45996 + * Known fixed with PHP 5.2.9 + libxml2-2.7.3 + */ +class PhpXmlBugTester { + var $parsedData = ''; + var $ok = false; + function __construct() { + $charData = '<b>c</b>'; + $xml = '<a>' . htmlspecialchars( $charData ) . '</a>'; + + $parser = xml_parser_create(); + xml_set_character_data_handler( $parser, array( $this, 'chardata' ) ); + $parsedOk = xml_parse($parser, $xml, true); + $this->ok = $parsedOk && ($this->parsedData == $charData); + } + function chardata($parser, $data) { + $this->parsedData .= $data; + } +} + +/** + * Test for PHP bug #50394 (PHP 5.3.x conversion to null only, not 5.2.x) + */ +class PhpRefCallBugTester { + public $ok = false; + + function __call( $name, $args ) { + $old = error_reporting( E_ALL & ~E_WARNING ); + call_user_func_array( array( $this, 'checkForBrokenRef' ), $args ); + error_reporting( $old ); + } + + function checkForBrokenRef( &$var ) { + if ( $var ) { + $this->ok = true; + } + } + + function execute() { + $var = true; + call_user_func_array( array( $this, 'foo' ), array( &$var ) ); + } +} + function readconsole( $prompt = '' ) { static $isatty = null; if ( is_null( $isatty ) ) { @@ -144,4 +210,4 @@ function mw_have_dl() { && is_callable( 'dl' ) && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ); -}
\ No newline at end of file +} |