diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2012-12-29 21:38:48 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2012-12-29 21:38:48 (GMT) |
commit | c1b59d455261de2d18fb3f5005958b4411d6b314 (patch) | |
tree | 8fc3d1d29f753fe4f9445a48a331c8ca4dd80643 /Modules/_sre.c | |
parent | 2d8298dcd2ea4cbac7ca2fab03f840cb1003a8b4 (diff) | |
download | cpython-c1b59d455261de2d18fb3f5005958b4411d6b314.zip cpython-c1b59d455261de2d18fb3f5005958b4411d6b314.tar.gz cpython-c1b59d455261de2d18fb3f5005958b4411d6b314.tar.bz2 |
Issue #16688: Fix backreferences did make case-insensitive regex fail on non-ASCII strings.
Patch by Matthew Barnett.
Diffstat (limited to 'Modules/_sre.c')
-rw-r--r-- | Modules/_sre.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/Modules/_sre.c b/Modules/_sre.c index de35396..aa56529 100644 --- a/Modules/_sre.c +++ b/Modules/_sre.c @@ -492,7 +492,7 @@ SRE_COUNT(SRE_STATE* state, SRE_CODE* pattern, Py_ssize_t maxcount) Py_ssize_t i; /* adjust end */ - if (maxcount < end - ptr && maxcount != 65535) + if (maxcount < (end - ptr) / state->charsize && maxcount != 65535) end = ptr + maxcount*state->charsize; switch (pattern[0]) { @@ -583,7 +583,7 @@ SRE_INFO(SRE_STATE* state, SRE_CODE* pattern) Py_ssize_t i; /* check minimal length */ - if (pattern[3] && (end - ptr) < pattern[3]) + if (pattern[3] && (end - ptr)/state->charsize < pattern[3]) return 0; /* check known prefix */ @@ -801,7 +801,7 @@ entrance: /* <INFO> <1=skip> <2=flags> <3=min> ... */ if (ctx->pattern[3] && (end - ctx->ptr)/state->charsize < ctx->pattern[3]) { TRACE(("reject (got %d chars, need %d)\n", - (end - ctx->ptr), ctx->pattern[3])); + (end - ctx->ptr)/state->charsize, ctx->pattern[3])); RETURN_FAILURE; } ctx->pattern += ctx->pattern[1] + 1; @@ -1329,9 +1329,10 @@ entrance: RETURN_FAILURE; while (p < e) { if (ctx->ptr >= end || - state->lower(SRE_CHARGET(state, ctx->ptr, 0)) != state->lower(*p)) + state->lower(SRE_CHARGET(state, ctx->ptr, 0)) != + state->lower(SRE_CHARGET(state, p, 0))) RETURN_FAILURE; - p++; + p += state->charsize; ctx->ptr += state->charsize; } } |