perl -Dr: avoid coredump in \1
authorDavid Mitchell <davem@iabyn.com>
Thu, 18 Jan 2018 15:27:25 +0000 (15:27 +0000)
committerDavid Mitchell <davem@iabyn.com>
Thu, 18 Jan 2018 18:19:56 +0000 (18:19 +0000)
When displaying each reg node being executed, the code that dumps a REF
node assumed that a capture was valid if progs->offs[n].start != -1.
In fact during backtracking after a failure, a capture is "undone" by
merely setting progs->offs[n].end = -1.

So make the dump code account for that too.

This was causing a test in t/re/pat.t to coredump:

    use re qw(Debug EXECUTE);
    "x" =~ m{ () y | () \1 }x;

Although given that neither the test nor the REF code in regprop() have
changed recently, I'm not sure why this has only recently started crashing.

regcomp.c

index 376b697..06ebf37 100644 (file)
--- a/regcomp.c
+++ b/regcomp.c
@@ -19364,7 +19364,7 @@ Perl_regprop(pTHX_ const regexp *prog, SV *sv, const regnode *o, const regmatch_
         if ( k == REF && reginfo) {
             U32 n = ARG(o);  /* which paren pair */
             I32 ln = prog->offs[n].start;
-            if (prog->lastparen < n || ln == -1)
+            if (prog->lastparen < n || ln == -1 || prog->offs[n].end == -1)
                 Perl_sv_catpvf(aTHX_ sv, ": FAIL");
             else if (ln == prog->offs[n].end)
                 Perl_sv_catpvf(aTHX_ sv, ": ACCEPT - EMPTY STRING");