11 Star 0 Fork 33

src-openEuler/pcre2

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
backport-Fix-X-matching-in-32-bit-mode-without-UTF-in-JIT.patch 2.82 KB
一键复制 编辑 原始数据 按行查看 历史
From 45dcb3de900b77583f4e9daa663004c55fad4794 Mon Sep 17 00:00:00 2001
From: Zoltan Herczeg <hzmester@freemail.hu>
Date: Wed, 22 Nov 2023 10:22:59 +0000
Subject: [PATCH] Fix \X matching in 32 bit mode without UTF in JIT
---
src/pcre2_jit_compile.c | 6 +++---
testdata/testinput12 | 4 ++++
testdata/testoutput12-16 | 9 +++++++++
testdata/testoutput12-32 | 5 +++++
4 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/src/pcre2_jit_compile.c b/src/pcre2_jit_compile.c
index 510c392..8d64e1c 100644
--- a/src/pcre2_jit_compile.c
+++ b/src/pcre2_jit_compile.c
@@ -8718,7 +8718,7 @@ c = *cc++;
#if PCRE2_CODE_UNIT_WIDTH == 32
if (c >= 0x110000)
- return NULL;
+ return cc;
#endif /* PCRE2_CODE_UNIT_WIDTH == 32 */
lgb = UCD_GRAPHBREAK(c);
@@ -8958,7 +8958,7 @@ switch(type)
#else
sljit_emit_icall(compiler, SLJIT_CALL, SLJIT_ARGS2(W, W, W), SLJIT_IMM,
common->invalid_utf ? SLJIT_FUNC_ADDR(do_extuni_utf_invalid) : SLJIT_FUNC_ADDR(do_extuni_no_utf));
- if (!common->utf || common->invalid_utf)
+ if (common->invalid_utf)
add_jump(compiler, backtracks, CMP(SLJIT_EQUAL, SLJIT_RETURN_REG, 0, SLJIT_IMM, 0));
#endif
@@ -12044,7 +12044,7 @@ switch(opcode)
}
#if defined SUPPORT_UNICODE && PCRE2_CODE_UNIT_WIDTH != 32
- if (common->utf)
+ if (type == OP_EXTUNI || common->utf)
{
OP1(SLJIT_MOV, tmp_base, tmp_offset, STR_PTR, 0);
detect_partial_match(common, &no_match);
diff --git a/testdata/testinput12 b/testdata/testinput12
index 5a2d8d2..a6678bb 100644
--- a/testdata/testinput12
+++ b/testdata/testinput12
@@ -569,4 +569,8 @@
/\x{802a0000}*/
\x{802a0000}\x{802a0000}
+# UTF matching without UTF, check invalid UTF characters
+/\X++/
+ a\x{110000}\x{ffffffff}
+
# End of testinput12
diff --git a/testdata/testoutput12-16 b/testdata/testoutput12-16
index 9ac403e..f3b40a3 100644
--- a/testdata/testoutput12-16
+++ b/testdata/testoutput12-16
@@ -1814,4 +1814,13 @@ No match
Failed: error 134 at offset 11: character code point value in \x{} or \o{} is too large
\x{802a0000}\x{802a0000}
+# UTF matching without UTF, check invalid UTF characters
+/\X++/
+ a\x{110000}\x{ffffffff}
+** Character \x{110000} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+** Character \x{ffffffff} is greater than 0xffff and UTF-16 mode is not enabled.
+** Truncation will probably give the wrong result.
+ 0: a\x00\x{ffff}
+
# End of testinput12
diff --git a/testdata/testoutput12-32 b/testdata/testoutput12-32
index 9396305..dd42f86 100644
--- a/testdata/testoutput12-32
+++ b/testdata/testoutput12-32
@@ -1812,4 +1812,9 @@ No match
\x{802a0000}\x{802a0000}
0: \x{802a0000}\x{802a0000}
+# UTF matching without UTF, check invalid UTF characters
+/\X++/
+ a\x{110000}\x{ffffffff}
+ 0: a\x{110000}\x{ffffffff}
+
# End of testinput12
--
2.33.0
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/src-openeuler/pcre2.git
git@gitee.com:src-openeuler/pcre2.git
src-openeuler
pcre2
pcre2
master

搜索帮助

D67c1975 1850385 1daf7b77 1850385