Skip to content

Commit bb6ceec

Browse files
committed
Merge branch 'PHP-8.3'
* PHP-8.3: Fix bug in mb_get_substr_slow (sometimes outputs wrong number of characters)
2 parents 5dfb2d9 + e814197 commit bb6ceec

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

ext/mbstring/mbstring.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,9 +2099,10 @@ static zend_string* mb_get_substr_slow(unsigned char *in, size_t in_len, size_t
20992099
if (from >= out_len) {
21002100
from -= out_len;
21012101
} else {
2102-
enc->from_wchar(wchar_buf + from, MIN(out_len - from, len), &buf, !in_len || out_len >= len);
2102+
size_t needed_codepoints = MIN(out_len - from, len);
2103+
enc->from_wchar(wchar_buf + from, needed_codepoints, &buf, !in_len || out_len >= len);
21032104
from = 0;
2104-
len -= MIN(out_len, len);
2105+
len -= needed_codepoints;
21052106
}
21062107
}
21072108

ext/mbstring/tests/mb_substr.phpt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ echo "Regression:\n";
133133
$str = "\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbe\xbd\xbd\xbd\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x89\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x00\x00\x00\x00\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8b\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8f\x8b\x8b\x8b\xbd\xbd\xbd\xbd\xbd\xbd\xbd\xbe\x01:O\xaa\xd3";
134134
echo bin2hex(mb_substr($str, 0, 128, "JIS")), "\n";
135135

136+
/* Alex messed up when reimplementing mb_substr and, in cases where `from` is non-zero and
137+
* the number of characters to extract is more than 128, miscalculated where to end the substring
138+
* Thanks to Maurício Fauth for finding the issue */
139+
var_dump(mb_substr('Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum dapibus feugiat ex non cursus. Pellentesque vestibulum tellus sit lectus.', 19, -1));
140+
136141
?>
137142
--EXPECT--
138143
EUC-JP:
@@ -213,3 +218,4 @@ Testing agreement with mb_strpos on invalid UTF-8 string:
213218
?AAA
214219
Regression:
215220
1b28493d3d3d3d3d3d3d3e3d3d3d1b28423f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f000000003f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f1b28493d3d3d3d3d3d3d3e1b2842013a4f1b28492a1b2842
221+
string(121) "it amet, consectetur adipiscing elit. Vestibulum dapibus feugiat ex non cursus. Pellentesque vestibulum tellus sit lectus"

0 commit comments

Comments
 (0)