[php-src] PHP-8.4: ext/mbstring: Fix truncated encoding names resolving to full names (#23974)
| From: | Kamil Tekiela via GitHub | Date: | Mon, 12 Oct 2026 13:26:49 +0000 |
| Subject: | [php-src] PHP-8.4: ext/mbstring: Fix truncated encoding names resolving to full names (#23974) | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-142203@lists.php.net to get a copy of this message | ||
Author: Kamil Tekiela (kamil-tekiela)
Committer: GitHub (web-flow)
Pusher: kamil-tekiela
Date: 2026-10-12T14:26:46+01:00
Commit: https://github.com/php/php-src/commit/5838b68a14ce2d9692a71cb5ed7f9ece69ab1886
Raw diff: https://github.com/php/php-src/commit/5838b68a14ce2d9692a71cb5ed7f9ece69ab1886.diff
ext/mbstring: Fix truncated encoding names resolving to full names (#23974)
Closes GH-23958
Changed paths:
A ext/mbstring/tests/gh23958.phpt
M NEWS
M ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
M ext/mbstring/mbstring.c
M ext/mbstring/tests/gh15824.phpt
Diff:
diff --git a/NEWS b/NEWS
index aaed43baa2c8..ee0c8117693f 100644
--- a/NEWS
+++ b/NEWS
@@ -168,6 +168,7 @@ PHP NEWS
a truncated UTF-8 sequence). (Lazizbek Ergashev)
. Fixed mbstring functions emitting surrogates in UTF-8 output and flagging
it as valid UTF-8. (Nicolas Grekas)
+ . Fixed bug GH-23958 (truncated encoding names resolving to full names). (Kamil Tekiela)
- MySQLi:
. Fix GH-22854: Fixed failed assertion when accessing mysqli property after
diff --git a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
index f1e25dc7537b..adbedc3f0c14 100644
--- a/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
+++ b/ext/mbstring/libmbfl/mbfl/mbfl_encoding.c
@@ -339,7 +339,7 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
int8_t offset = mbfl_encoding_ptr_list_after_hashing[key];
if (offset >= 0) {
encoding = mbfl_encoding_ptr_list + offset;
- if (strncasecmp((*encoding)->name, name, name_len) == 0) {
+ if (strlen((*encoding)->name) == name_len && strncasecmp((*encoding)->name, name,
name_len) == 0) {
return *encoding;
}
}
diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c
index 6fbeb43fc1b4..7e0b47deae9a 100644
--- a/ext/mbstring/mbstring.c
+++ b/ext/mbstring/mbstring.c
@@ -275,7 +275,7 @@ static const mbfl_encoding *php_mb_get_encoding(zend_string *encoding_name, uint
}
static const mbfl_encoding *php_mb_get_encoding_or_pass(const char *encoding_name, size_t
encoding_name_len) {
- if (strncmp(encoding_name, "pass", encoding_name_len) == 0) {
+ if (encoding_name_len == strlen("pass") && strncmp(encoding_name,
"pass", encoding_name_len) == 0) {
return &mbfl_encoding_pass;
}
@@ -335,7 +335,7 @@ static zend_result php_mb_parse_encoding_list(const char *value, size_t value_le
}
size_t p1_length = p - p1 + 1;
/* convert to the encoding number and check encoding */
- if (strncasecmp(p1, "auto", p1_length) == 0) {
+ if (p1_length == strlen("auto") && strncasecmp(p1, "auto",
p1_length) == 0) {
if (!included_auto) {
const enum mbfl_no_encoding *src = MBSTRG(default_detect_order_list);
const size_t identify_list_size = MBSTRG(default_detect_order_list_size);
diff --git a/ext/mbstring/tests/gh15824.phpt b/ext/mbstring/tests/gh15824.phpt
index 570bb2b9d038..553eb2b58e3b 100644
--- a/ext/mbstring/tests/gh15824.phpt
+++ b/ext/mbstring/tests/gh15824.phpt
@@ -17,8 +17,8 @@ var_dump(mb_detect_encoding("\x9D", 'US-ASCII, CP1254,
cyrillic', false));
echo "== mime name ==\n";
var_dump(mb_detect_encoding('abc', 'ANSI_X3.4-1968, ISO-8859-1'));
var_dump(mb_detect_encoding('abc', 'CP50220, ANSI_X3.4-1968'));
-/* last comma is not mistake, intentionally */
-var_dump(mb_detect_encoding(bin2hex('1b24422422242424262428242a1b2842'), 'CP50220,
ANSI_X3.4-1968,', false));
+
+var_dump(mb_detect_encoding(bin2hex('1b24422422242424262428242a1b2842'), 'CP50220,
ANSI_X3.4-1968', false));
var_dump(mb_detect_encoding('😄', 'US-ASCII, UTF-8-Mobile#KDDI-B, UTF-8'));
?>
--EXPECT--
diff --git a/ext/mbstring/tests/gh23958.phpt b/ext/mbstring/tests/gh23958.phpt
new file mode 100644
index 000000000000..6d5a586e159b
--- /dev/null
+++ b/ext/mbstring/tests/gh23958.phpt
@@ -0,0 +1,35 @@
+--TEST--
+GH-23958: Truncated encoding names must not be accepted
+--EXTENSIONS--
+mbstring
+--FILE--
+<?php
+foreach (['pa', 'UCS-', '',] as $name) {
+ try {
+ mb_http_output($name);
+ } catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+ }
+}
+try {
+ mb_detect_order('aut');
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+var_dump(ini_set('mbstring.detect_order', ','));
+
+try {
+ mb_detect_encoding(bin2hex('1b24422422242424262428242a1b2842'), 'CP50220,
ANSI_X3.4-1968,', false);
+} catch (ValueError $e) {
+ echo $e->getMessage(), "\n";
+}
+?>
+--EXPECTF--
+mb_http_output(): Argument #1 ($encoding) must be a valid encoding, "pa" given
+mb_http_output(): Argument #1 ($encoding) must be a valid encoding, "UCS-" given
+mb_http_output(): Argument #1 ($encoding) must be a valid encoding, "" given
+mb_detect_order(): Argument #1 ($encoding) contains invalid encoding "aut"
+
+Warning: ini_set(): INI setting contains invalid encoding "" in %s on line %d
+bool(false)
+mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding ""