X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/51ff73d1c23dde7d9149040d018c42ae27b20a0c..be2b880c99ef361c37567b9d8c5d1f326c005579:/install-utils.inc diff --git a/install-utils.inc b/install-utils.inc index 6a99ec55..36465b64 100644 --- a/install-utils.inc +++ b/install-utils.inc @@ -1,5 +1,12 @@ 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; @@ -62,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 = 'c'; + $xml = '' . htmlspecialchars( $charData ) . ''; + + $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 ) ) { @@ -137,4 +210,4 @@ function mw_have_dl() { && is_callable( 'dl' ) && wfIniGetBool( 'enable_dl' ) && !wfIniGetBool( 'safe_mode' ); -} \ No newline at end of file +}