https://bugs.exim.org/show_bug.cgi?id=1887

            Bug ID: 1887
           Summary: Conditional groups fail with definition inside an
                    assertion inside recursion in non-JIT mode
           Product: PCRE
           Version: 8.39
          Hardware: x86
                OS: All
            Status: NEW
          Severity: bug
          Priority: medium
         Component: Code
          Assignee: p...@hermes.cam.ac.uk
          Reporter: bobw...@hotmail.com
                CC: pcre-dev@exim.org

Somehow, when declaring a capturing group inside an assertion, the capturing
group isn't reset when backtracking, if:
- we are recursing into a capturing group via (?&m),
- there has already been another capturing group matched (here: the empty group
"()"),
- and we aren't in JIT mode.

Consider this input:

123

Then following regex fails to match (without JIT):

(?(DEFINE)
(?<m>
  1? (?=(?<cond>2)?) 1 2 (?(cond)|3)
)
)
\A
()
(?&m)
\Z

The following regexes work:

\A
(?=())
# inlined version
1? (?=(?<cond>2)?) 1 2 (?(cond)|3)
\Z

and:

(?(DEFINE)
(?<m>
  1? (?=(?<cond>2)?) 1 2 (?(cond)|3)
)
)
\A
# no () here
(?&m)
\Z

Similarly, this matches even though it really shouldn't:

(?(DEFINE)
(?<m>
  1? (?(cond)12) (?=(?<cond>2)?) 3
)
)
\A
()
(?&m)
\Z

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-- 
## List details at https://lists.exim.org/mailman/listinfo/pcre-dev 

Reply via email to