Browse Source

Fix missing setlocale with php 8

When php version = 8, basename('§') does not bug even if LC_ALL is non-UTF-8 locale.
This cause OC_Util::isSetLocaleWorking() to skip setlocale("C.UTF-8").

Fix it by using escapeshellcmd instead of basename.

Signed-off-by: Naoto Kobayashi <naoto.kobayashi4c@gmail.com>
pull/29695/head
Naoto Kobayashi 4 years ago
parent
commit
455bff5c17
  1. 4
      lib/private/legacy/OC_Util.php
  2. 8
      tests/lib/UtilTest.php

4
lib/private/legacy/OC_Util.php

@ -1245,14 +1245,14 @@ class OC_Util {
* @return bool
*/
public static function isSetLocaleWorking() {
if ('' === basename('§')) {
if ('' === escapeshellcmd('§')) {
// Borrowed from \Patchwork\Utf8\Bootup::initLocale
setlocale(LC_ALL, 'C.UTF-8', 'C');
setlocale(LC_CTYPE, 'en_US.UTF-8', 'fr_FR.UTF-8', 'es_ES.UTF-8', 'de_DE.UTF-8', 'ru_RU.UTF-8', 'pt_BR.UTF-8', 'it_IT.UTF-8', 'ja_JP.UTF-8', 'zh_CN.UTF-8', '0');
}
// Check again
if ('' === basename('§')) {
if ('' === escapeshellcmd('§')) {
return false;
}
return true;

8
tests/lib/UtilTest.php

@ -74,6 +74,14 @@ class UtilTest extends \Test\TestCase {
$this->assertEquals("/%C2%A7%23%40test%25%26%5E%C3%A4/-child", $result);
}
public function testIsSetLocaleWorking() {
// OC_Util::isSetLocaleWorking() assumes escapeshellcmd('§') returns '' with non-UTF-8 locale.
$locale = setlocale(LC_CTYPE, 0);
setlocale(LC_CTYPE, 'C');
$this->assertEquals('', escapeshellcmd('§'));
setlocale(LC_CTYPE, $locale);
}
public function testFileInfoLoaded() {
$expected = function_exists('finfo_open');
$this->assertEquals($expected, \OC_Util::fileInfoLoaded());

Loading…
Cancel
Save