Skip to content

Commit ed60d6d

Browse files
committed
Fix GH-15824 mb_detect_encoding() invalid "UTF8"
I fixed from strcasecmp to strncasecmp. However, strncasecmp is specify size to #3 parameter. Hence, Add check strlen to mime and aliases.
1 parent 201c691 commit ed60d6d

File tree

2 files changed

+16
-2
lines changed

2 files changed

+16
-2
lines changed

ext/mbstring/libmbfl/mbfl/mbfl_encoding.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,10 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
332332
}
333333
#endif
334334

335+
if (name_len == 0) {
336+
return NULL;
337+
}
338+
335339
/* Use perfect hash lookup for name */
336340
if (name_len <= NAME_HASH_MAX_NAME_LENGTH && name_len >= NAME_HASH_MIN_NAME_LENGTH) {
337341
unsigned int key = mbfl_name2encoding_perfect_hash(name, name_len);
@@ -349,7 +353,7 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
349353
/* search MIME charset name */
350354
for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
351355
if ((*encoding)->mime_name) {
352-
if (strcasecmp((*encoding)->mime_name, name) == 0) {
356+
if (strcasecmp((*encoding)->mime_name, name) == 0 && strlen((*encoding)->mime_name) == name_len) {
353357
return *encoding;
354358
}
355359
}
@@ -359,7 +363,7 @@ const mbfl_encoding *mbfl_name2encoding_ex(const char *name, size_t name_len)
359363
for (encoding = mbfl_encoding_ptr_list; *encoding; encoding++) {
360364
if ((*encoding)->aliases) {
361365
for (const char **alias = (*encoding)->aliases; *alias; alias++) {
362-
if (strcasecmp(*alias, name) == 0) {
366+
if (strncasecmp(name, *alias, name_len) == 0 && strlen(*alias) == name_len) {
363367
return *encoding;
364368
}
365369
}

ext/mbstring/tests/gh15824.phpt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
GH-15824 (ValueError: mb_detect_encoding(): Argument #2 ($encodings) contains invalid encoding "UTF8")
3+
--EXTENSIONS--
4+
mbstring
5+
--FILE--
6+
<?php
7+
echo mb_detect_encoding('abc', 'UTF8, ASCII');
8+
?>
9+
--EXPECT--
10+
UTF-8

0 commit comments

Comments
 (0)