Skip to content

Commit d27dc5c

Browse files
committed
Fix #80118: Erroneous whitespace match with JIT only
We backport r1273[1] from PCRE2. [1] <https://vcs.pcre.org/pcre2?revision=1273&view=revision> Closes phpGH-6165.
1 parent 105132b commit d27dc5c

File tree

3 files changed

+39
-8
lines changed

3 files changed

+39
-8
lines changed

NEWS

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ PHP NEWS
1414

1515
- PCRE:
1616
. Updated to PCRE 10.35. (cmb)
17+
. Fixed bug #80118 (Erroneous whitespace match with JIT only). (cmb)
1718

1819
- Standard:
1920
. Fixed bug #80114 (parse_url does not accept URLs with port 0). (cmb, twosee)

ext/pcre/pcre2lib/pcre2_jit_compile.c

+28-8
Original file line numberDiff line numberDiff line change
@@ -7594,32 +7594,52 @@ if (needstype || needsscript)
75947594
}
75957595

75967596
cc = ccbegin;
7597-
}
75987597

7599-
if (needschar)
7600-
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
7598+
if (needstype)
7599+
{
7600+
/* TMP2 has already been shifted by 2 */
7601+
if (!needschar)
7602+
{
7603+
OP2(SLJIT_ADD, TMP1, 0, TMP2, 0, TMP2, 0);
7604+
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
7605+
7606+
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
7607+
}
7608+
else
7609+
{
7610+
OP2(SLJIT_ADD, TMP1, 0, TMP2, 0, TMP2, 0);
7611+
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
76017612

7602-
if (needstype)
7613+
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
7614+
OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
7615+
typereg = RETURN_ADDR;
7616+
}
7617+
}
7618+
else if (needschar)
7619+
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
7620+
}
7621+
else if (needstype)
76037622
{
7623+
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 3);
7624+
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
7625+
76047626
if (!needschar)
76057627
{
7606-
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 3);
7607-
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 2);
76087628
OP2(SLJIT_ADD, TMP1, 0, TMP1, 0, TMP2, 0);
76097629

76107630
OP1(SLJIT_MOV_U8, TMP1, 0, SLJIT_MEM1(TMP1), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
76117631
}
76127632
else
76137633
{
7614-
OP2(SLJIT_SHL, TMP1, 0, TMP2, 0, SLJIT_IMM, 2);
7615-
OP2(SLJIT_SHL, TMP2, 0, TMP2, 0, SLJIT_IMM, 3);
76167634
OP2(SLJIT_ADD, TMP2, 0, TMP2, 0, TMP1, 0);
76177635

76187636
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
76197637
OP1(SLJIT_MOV_U8, RETURN_ADDR, 0, SLJIT_MEM1(TMP2), (sljit_sw)PRIV(ucd_records) + SLJIT_OFFSETOF(ucd_record, chartype));
76207638
typereg = RETURN_ADDR;
76217639
}
76227640
}
7641+
else if (needschar)
7642+
OP1(SLJIT_MOV, TMP1, 0, RETURN_ADDR, 0);
76237643
}
76247644
#endif /* SUPPORT_UNICODE */
76257645

ext/pcre/tests/bug80118.phpt

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
--TEST--
2+
Bug #80118 (Erroneous whitespace match with JIT only)
3+
--FILE--
4+
<?php
5+
preg_match('~[^\p{Han}\p{Z}]~u', ' ', $matches);
6+
var_dump($matches);
7+
?>
8+
--EXPECT--
9+
array(0) {
10+
}

0 commit comments

Comments
 (0)