diff options
author | ph10 <ph10@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2015-04-08 16:34:24 +0000 |
---|---|---|
committer | ph10 <ph10@2f5784b3-3f2a-0410-8824-cb99058d5e15> | 2015-04-08 16:34:24 +0000 |
commit | 4a81b0ca19da65ea9a50c208017a74e55c3fd027 (patch) | |
tree | a709c6cf7a770cd5a8fc13574fcda12b3b2be127 /pcre_exec.c | |
parent | c3579a7581cb8b3ca3c9617d63083afea29de646 (diff) | |
download | pcre-4a81b0ca19da65ea9a50c208017a74e55c3fd027.tar.gz |
Fix backtracking bug for \C\X* in UTF mode.
git-svn-id: svn://vcs.exim.org/pcre/code/trunk@1545 2f5784b3-3f2a-0410-8824-cb99058d5e15
Diffstat (limited to 'pcre_exec.c')
-rw-r--r-- | pcre_exec.c | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/pcre_exec.c b/pcre_exec.c index 13dfed5..5fe68b0 100644 --- a/pcre_exec.c +++ b/pcre_exec.c @@ -1376,7 +1376,7 @@ for (;;) break; case OP_DEF: /* DEFINE - always false */ - case OP_FAIL: /* From optimized (?!) condition */ + case OP_FAIL: /* From optimized (?!) condition */ break; /* The condition is an assertion. Call match() to evaluate it - setting @@ -5652,12 +5652,17 @@ for (;;) if (possessive) continue; /* No backtracking */ + /* We use <= pp rather than == pp to detect the start of the run while + backtracking because the use of \C in UTF mode can cause BACKCHAR to + move back past pp. This is just palliative; the use of \C in UTF mode + is fraught with danger. */ + for(;;) { int lgb, rgb; PCRE_PUCHAR fptr; - if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */ + if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */ RMATCH(eptr, ecode, offset_top, md, eptrb, RM45); if (rrc != MATCH_NOMATCH) RRETURN(rrc); @@ -5675,7 +5680,7 @@ for (;;) for (;;) { - if (eptr == pp) goto TAIL_RECURSE; /* At start of char run */ + if (eptr <= pp) goto TAIL_RECURSE; /* At start of char run */ fptr = eptr - 1; if (!utf) c = *fptr; else { |