summaryrefslogtreecommitdiffstats
path: root/Modules/_sre
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2023-10-14 06:42:19 (GMT)
committerGitHub <noreply@github.com>2023-10-14 06:42:19 (GMT)
commita2cc9a4c3a979380b343239c5bb929a1eaada427 (patch)
tree8820f61e12140fce03694b229465045a0862b074 /Modules/_sre
parent12b9cb80be5e75e63bae7c63053f334705d2de90 (diff)
downloadcpython-a2cc9a4c3a979380b343239c5bb929a1eaada427.zip
cpython-a2cc9a4c3a979380b343239c5bb929a1eaada427.tar.gz
cpython-a2cc9a4c3a979380b343239c5bb929a1eaada427.tar.bz2
[3.12] gh-109747: Improve errors for unsupported look-behind patterns (GH-109859) (GH-110859)
Now re.error is raised instead of OverflowError or RuntimeError for too large width of look-behind pattern. The limit is increased to 2**32-1 (was 2**31-1). (cherry picked from commit e2b3d831fd2824d8a5713e3ed2a64aad0fb6b62d) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Diffstat (limited to 'Modules/_sre')
-rw-r--r--Modules/_sre/sre.c2
-rw-r--r--Modules/_sre/sre_lib.h14
2 files changed, 7 insertions, 9 deletions
diff --git a/Modules/_sre/sre.c b/Modules/_sre/sre.c
index ace2e9b..0547390 100644
--- a/Modules/_sre/sre.c
+++ b/Modules/_sre/sre.c
@@ -2024,8 +2024,6 @@ _validate_inner(SRE_CODE *code, SRE_CODE *end, Py_ssize_t groups)
GET_SKIP;
GET_ARG; /* 0 for lookahead, width for lookbehind */
code--; /* Back up over arg to simplify math below */
- if (arg & 0x80000000)
- FAIL; /* Width too large */
/* Stop 1 before the end; we check the SUCCESS below */
if (_validate_inner(code+1, code+skip-2, groups))
FAIL;
diff --git a/Modules/_sre/sre_lib.h b/Modules/_sre/sre_lib.h
index f8d556b..95c1ada 100644
--- a/Modules/_sre/sre_lib.h
+++ b/Modules/_sre/sre_lib.h
@@ -589,8 +589,8 @@ entrance:
/* optimization info block */
/* <INFO> <1=skip> <2=flags> <3=min> ... */
if (pattern[3] && (uintptr_t)(end - ptr) < pattern[3]) {
- TRACE(("reject (got %zd chars, need %zd)\n",
- end - ptr, (Py_ssize_t) pattern[3]));
+ TRACE(("reject (got %tu chars, need %zu)\n",
+ end - ptr, (size_t) pattern[3]));
RETURN_FAILURE;
}
pattern += pattern[1] + 1;
@@ -1507,7 +1507,7 @@ dispatch:
/* <ASSERT> <skip> <back> <pattern> */
TRACE(("|%p|%p|ASSERT %d\n", pattern,
ptr, pattern[1]));
- if (ptr - (SRE_CHAR *)state->beginning < (Py_ssize_t)pattern[1])
+ if ((uintptr_t)(ptr - (SRE_CHAR *)state->beginning) < pattern[1])
RETURN_FAILURE;
state->ptr = ptr - pattern[1];
DO_JUMP0(JUMP_ASSERT, jump_assert, pattern+2);
@@ -1520,7 +1520,7 @@ dispatch:
/* <ASSERT_NOT> <skip> <back> <pattern> */
TRACE(("|%p|%p|ASSERT_NOT %d\n", pattern,
ptr, pattern[1]));
- if (ptr - (SRE_CHAR *)state->beginning >= (Py_ssize_t)pattern[1]) {
+ if ((uintptr_t)(ptr - (SRE_CHAR *)state->beginning) >= pattern[1]) {
state->ptr = ptr - pattern[1];
LASTMARK_SAVE();
if (state->repeat)
@@ -1655,9 +1655,9 @@ SRE(search)(SRE_STATE* state, SRE_CODE* pattern)
flags = pattern[2];
- if (pattern[3] && end - ptr < (Py_ssize_t)pattern[3]) {
- TRACE(("reject (got %u chars, need %u)\n",
- (unsigned int)(end - ptr), pattern[3]));
+ if (pattern[3] && (uintptr_t)(end - ptr) < pattern[3]) {
+ TRACE(("reject (got %tu chars, need %zu)\n",
+ end - ptr, (size_t) pattern[3]));
return 0;
}
if (pattern[3] > 1) {