aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNaoto Kobayashi <naoto.kobayashi4c@gmail.com>2021-11-14 00:58:36 +0900
committerbackportbot[bot] <backportbot[bot]@users.noreply.github.com>2021-11-16 17:52:17 +0000
commit7e80182e75144bd656f246920ab191faf4bba8b1 (patch)
tree6539934b87987db96bb985e0cf699e3b26df24ed
parenta80d49a0e7a86aed86fba91086117c55ee210b9c (diff)
downloadnextcloud-server-7e80182e75144bd656f246920ab191faf4bba8b1.tar.gz
nextcloud-server-7e80182e75144bd656f246920ab191faf4bba8b1.zip
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>
-rw-r--r--lib/private/legacy/OC_Util.php4
-rw-r--r--tests/lib/UtilTest.php8
2 files changed, 10 insertions, 2 deletions
diff --git a/lib/private/legacy/OC_Util.php b/lib/private/legacy/OC_Util.php
index 35c81dd34e6..94fcb900898 100644
--- a/lib/private/legacy/OC_Util.php
+++ b/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;
diff --git a/tests/lib/UtilTest.php b/tests/lib/UtilTest.php
index 04d4858fb26..b9c791735bb 100644
--- a/tests/lib/UtilTest.php
+++ b/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());