From: Máté Szabó Date: Mon, 8 Jul 2019 16:05:22 +0000 (+0200) Subject: Make MSCompoundFileReader::readFile platform-agnostic X-Git-Tag: 1.34.0-rc.0~1137 X-Git-Url: http://git.cyclocoop.org/?a=commitdiff_plain;h=6c462836a7964fb6cb39d1153112617b0c3abf59;p=lhc%2Fweb%2Fwiklou.git Make MSCompoundFileReader::readFile platform-agnostic MSCompoundFileReader::readFile uses iconv to convert information given in UTF-16 character set with little-endian byte order to the UTF-8 character set. The input string has no BOM and the byte order is not explicitly given, causing iconv to try to guess the byte order based on the host operating system. This causes the method to return different results for the same file in different environments. This patch explicitly provides the byte order for the input to be converted (UTF-16LE) to ensure portability and predictability. As part of this, move MSCompoundFileReaderTest into the unit test tree. Bug: T225019 Change-Id: I62154897d303b28c288c3a4f2f5456bedcc81852 --- diff --git a/includes/libs/mime/MSCompoundFileReader.php b/includes/libs/mime/MSCompoundFileReader.php index aea0a02f60..8afaa38e02 100644 --- a/includes/libs/mime/MSCompoundFileReader.php +++ b/includes/libs/mime/MSCompoundFileReader.php @@ -333,7 +333,7 @@ class MSCompoundFileReader { continue; } - $name = iconv( 'UTF-16', 'UTF-8', substr( $entry['name_raw'], 0, $entry['name_length'] - 2 ) ); + $name = iconv( 'UTF-16LE', 'UTF-8', substr( $entry['name_raw'], 0, $entry['name_length'] - 2 ) ); $clsid = $this->decodeClsid( $entry['clsid'] ); if ( $type == self::TYPE_ROOT && isset( self::$mimesByClsid[$clsid] ) ) { diff --git a/tests/phpunit/includes/libs/mime/MSCompoundFileReaderTest.php b/tests/phpunit/includes/libs/mime/MSCompoundFileReaderTest.php deleted file mode 100644 index 4509a61eb7..0000000000 --- a/tests/phpunit/includes/libs/mime/MSCompoundFileReaderTest.php +++ /dev/null @@ -1,60 +0,0 @@ -assertTrue( $info['valid'] ); - $this->assertSame( $expectedMime, $info['mime'] ); - } - - public static function provideInvalid() { - return [ - [ 'dir-beyond-end.xls', 'ERROR_READ_PAST_END' ], - [ 'fat-loop.xls', 'ERROR_INVALID_FORMAT' ], - [ 'invalid-signature.xls', 'ERROR_INVALID_SIGNATURE' ], - ]; - } - - /** @dataProvider provideInvalid */ - public function testReadFileInvalid( $fileName, $expectedError ) { - global $IP; - - $info = MSCompoundFileReader::readFile( "$IP/tests/phpunit/data/MSCompoundFileReader/$fileName" ); - $this->assertFalse( $info['valid'] ); - $this->assertSame( constant( MSCompoundFileReader::class . '::' . $expectedError ), - $info['errorCode'] ); - } -} diff --git a/tests/phpunit/unit/includes/libs/mime/MSCompoundFileReaderTest.php b/tests/phpunit/unit/includes/libs/mime/MSCompoundFileReaderTest.php new file mode 100644 index 0000000000..4509a61eb7 --- /dev/null +++ b/tests/phpunit/unit/includes/libs/mime/MSCompoundFileReaderTest.php @@ -0,0 +1,60 @@ +assertTrue( $info['valid'] ); + $this->assertSame( $expectedMime, $info['mime'] ); + } + + public static function provideInvalid() { + return [ + [ 'dir-beyond-end.xls', 'ERROR_READ_PAST_END' ], + [ 'fat-loop.xls', 'ERROR_INVALID_FORMAT' ], + [ 'invalid-signature.xls', 'ERROR_INVALID_SIGNATURE' ], + ]; + } + + /** @dataProvider provideInvalid */ + public function testReadFileInvalid( $fileName, $expectedError ) { + global $IP; + + $info = MSCompoundFileReader::readFile( "$IP/tests/phpunit/data/MSCompoundFileReader/$fileName" ); + $this->assertFalse( $info['valid'] ); + $this->assertSame( constant( MSCompoundFileReader::class . '::' . $expectedError ), + $info['errorCode'] ); + } +}