Skip to content

Commit 459ec62

Browse files
committed
Remove mbfl_strlen call when offset is positive in strpos functions
1 parent e1491f6 commit 459ec62

File tree

2 files changed

+18
-54
lines changed

2 files changed

+18
-54
lines changed

ext/mbstring/mbstring.c

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2099,14 +2099,12 @@ PHP_FUNCTION(mb_strpos)
20992099
RETURN_FALSE;
21002100
}
21012101

2102-
if (offset != 0) {
2102+
if (offset < 0) {
21032103
size_t slen = mbfl_strlen(&haystack);
2104+
offset += slen;
21042105
if (offset < 0) {
2105-
offset += slen;
2106-
}
2107-
if (offset < 0 || offset > slen) {
2108-
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
2109-
RETURN_FALSE;
2106+
zend_value_error("Offset not contained in string");
2107+
RETURN_THROWS();
21102108
}
21112109
}
21122110

@@ -4876,17 +4874,12 @@ MBSTRING_API size_t php_mb_stripos(int mode, const char *old_haystack, size_t ol
48764874
break;
48774875
}
48784876

4879-
if (offset != 0) {
4877+
if (offset < 0 && !mode) {
48804878
size_t haystack_char_len = mbfl_strlen(&haystack);
4881-
4882-
if (!mode) {
4883-
if (offset < 0) {
4884-
offset += (zend_long)haystack_char_len;
4885-
}
4886-
if (offset < 0 || (size_t)offset > haystack_char_len) {
4887-
php_error_docref(NULL, E_WARNING, "Offset not contained in string");
4888-
break;
4889-
}
4879+
offset += (zend_long)haystack_char_len;
4880+
if (offset < 0) {
4881+
n = -16;
4882+
break;
48904883
}
48914884
}
48924885

ext/mbstring/tests/mb_strpos.phpt

Lines changed: 9 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ include_once('common.inc');
1111

1212

1313
// Test string
14-
$euc_jp = '0123????????????EUC-JP????????0123?????????';
14+
$euc_jp = '0123この文字列は日本語です。EUC-JPを使っています。0123日本語は面倒臭い。';
1515

1616
$slen = mb_strlen($euc_jp, 'EUC-JP');
1717
echo "String len: $slen\n";
@@ -21,11 +21,11 @@ mb_internal_encoding('UTF-8') or print("mb_internal_encoding() failed\n");
2121

2222
echo "== POSITIVE OFFSET ==\n";
2323

24-
print mb_strpos($euc_jp, '???', 0, 'EUC-JP') . "\n";
24+
print mb_strpos($euc_jp, '日本語', 0, 'EUC-JP') . "\n";
2525
print mb_strpos($euc_jp, '0', 0, 'EUC-JP') . "\n";
2626
print mb_strpos($euc_jp, 3, 0, 'EUC-JP') . "\n";
2727
print mb_strpos($euc_jp, 0, 0, 'EUC-JP') . "\n";
28-
print mb_strpos($euc_jp, '???', 15, 'EUC-JP') . "\n";
28+
print mb_strpos($euc_jp, '日本語', 15, 'EUC-JP') . "\n";
2929
print mb_strpos($euc_jp, '0', 15, 'EUC-JP') . "\n";
3030
print mb_strpos($euc_jp, 3, 15, 'EUC-JP') . "\n";
3131
print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
@@ -34,37 +34,17 @@ print mb_strpos($euc_jp, 0, 15, 'EUC-JP') . "\n";
3434
// Negative offset
3535
echo "== NEGATIVE OFFSET ==\n";
3636

37-
print mb_strpos($euc_jp, '???', -15, 'EUC-JP') . "\n";
37+
print mb_strpos($euc_jp, '日本語', -15, 'EUC-JP') . "\n";
3838
print mb_strpos($euc_jp, '0', -15, 'EUC-JP') . "\n";
3939
print mb_strpos($euc_jp, 3, -15, 'EUC-JP') . "\n";
4040
print mb_strpos($euc_jp, 0, -15, 'EUC-JP') . "\n";
4141
print mb_strpos($euc_jp, 0, -43, 'EUC-JP') . "\n";
4242

43-
// Out of range - should return false
44-
print ("== OUT OF RANGE ==\n");
45-
46-
$r = mb_strpos($euc_jp, '???', 40, 'EUC-JP');
47-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
48-
$r = mb_strpos($euc_jp, '0', 40, 'EUC-JP');
49-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
50-
$r = mb_strpos($euc_jp, 3, 40, 'EUC-JP');
51-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
52-
$r = mb_strpos($euc_jp, 0, 40, 'EUC-JP');
53-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
54-
$r = mb_strpos($euc_jp, '???', -3, 'EUC-JP');
55-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
56-
$r = mb_strpos($euc_jp, '0', -3, 'EUC-JP');
57-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
58-
$r = mb_strpos($euc_jp, 3, -3, 'EUC-JP');
59-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
60-
$r = mb_strpos($euc_jp, 0, -3, 'EUC-JP');
61-
($r === FALSE) ? print "OK_OUT_RANGE\n" : print "NG_OUT_RANGE\n";
62-
6343

6444
// Non-existent
6545
echo "== NON-EXISTENT ==\n";
6646

67-
$r = mb_strpos($euc_jp, '???', 0, 'EUC-JP');
47+
$r = mb_strpos($euc_jp, '韓国語', 0, 'EUC-JP');
6848
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
6949
$r = mb_strpos($euc_jp, "\n", 0, 'EUC-JP');
7050
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
@@ -75,12 +55,12 @@ echo "== NO ENCODING PARAMETER ==\n";
7555

7656
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
7757

78-
print mb_strpos($euc_jp, '???', 0) . "\n";
58+
print mb_strpos($euc_jp, '日本語', 0) . "\n";
7959
print mb_strpos($euc_jp, '0', 0) . "\n";
8060
print mb_strpos($euc_jp, 3, 0) . "\n";
8161
print mb_strpos($euc_jp, 0, 0) . "\n";
8262

83-
$r = mb_strpos($euc_jp, '???', 0);
63+
$r = mb_strpos($euc_jp, '韓国語', 0);
8464
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
8565
$r = mb_strpos($euc_jp, "\n", 0);
8666
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
@@ -90,12 +70,12 @@ echo "== NO OFFSET AND ENCODING PARAMETER ==\n";
9070

9171
mb_internal_encoding('EUC-JP') or print("mb_internal_encoding() failed\n");
9272

93-
print mb_strpos($euc_jp, '???') . "\n";
73+
print mb_strpos($euc_jp, '日本語') . "\n";
9474
print mb_strpos($euc_jp, '0') . "\n";
9575
print mb_strpos($euc_jp, 3) . "\n";
9676
print mb_strpos($euc_jp, 0) . "\n";
9777

98-
$r = mb_strpos($euc_jp, '???');
78+
$r = mb_strpos($euc_jp, '韓国語');
9979
($r === FALSE) ? print "OK_STR\n" : print "NG_STR\n";
10080
$r = mb_strpos($euc_jp, "\n");
10181
($r === FALSE) ? print "OK_NEWLINE\n" : print "NG_NEWLINE\n";
@@ -118,15 +98,6 @@ String len: 43
11898
33
11999
30
120100
0
121-
== OUT OF RANGE ==
122-
OK_OUT_RANGE
123-
OK_OUT_RANGE
124-
OK_OUT_RANGE
125-
OK_OUT_RANGE
126-
OK_OUT_RANGE
127-
OK_OUT_RANGE
128-
OK_OUT_RANGE
129-
OK_OUT_RANGE
130101
== NON-EXISTENT ==
131102
OK_STR
132103
OK_NEWLINE

0 commit comments

Comments
 (0)