This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
signature sub (\x80 triggered an assertion
[perl5.git] / regexec.c
index 7d2a3ac..4e4b4fd 100644 (file)
--- a/regexec.c
+++ b/regexec.c
@@ -5343,6 +5343,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
     regnode *next;
     U32 n = 0; /* general value; init to avoid compiler warning */
     SSize_t ln = 0; /* len or last;  init to avoid compiler warning */
+    SSize_t endref = 0; /* offset of end of backref when ln is start */
     char *locinput = startpos;
     char *pushinput; /* where to continue after a PUSH */
     I32 nextchr;   /* is always set to UCHARAT(locinput), or -1 at EOS */
@@ -6673,10 +6674,11 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
 
          do_nref_ref_common:
            ln = rex->offs[n].start;
+           endref = rex->offs[n].end;
            reginfo->poscache_iter = reginfo->poscache_maxiter; /* Void cache */
-           if (rex->lastparen < n || ln == -1)
+           if (rex->lastparen < n || ln == -1 || endref == -1)
                sayNO;                  /* Do not match unless seen CLOSEn. */
-           if (ln == rex->offs[n].end)
+           if (ln == endref)
                break;
 
            s = reginfo->strbeg + ln;
@@ -6690,7 +6692,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                     * not going off the end given by reginfo->strend, and
                     * returns in <limit> upon success, how much of the
                     * current input was matched */
-               if (! foldEQ_utf8_flags(s, NULL, rex->offs[n].end - ln, utf8_target,
+               if (! foldEQ_utf8_flags(s, NULL, endref - ln, utf8_target,
                                    locinput, &limit, 0, utf8_target, utf8_fold_flags))
                {
                    sayNO;
@@ -6705,7 +6707,7 @@ S_regmatch(pTHX_ regmatch_info *reginfo, char *startpos, regnode *prog)
                (type == REF ||
                 UCHARAT(s) != fold_array[nextchr]))
                sayNO;
-           ln = rex->offs[n].end - ln;
+           ln = endref - ln;
            if (locinput + ln > reginfo->strend)
                sayNO;
            if (ln > 1 && (type == REF
@@ -8451,7 +8453,8 @@ NULL
             assert(!NEXTCHR_IS_EOS);
             if (utf8_target) {
                 locinput += PL_utf8skip[nextchr];
-                /* locinput is allowed to go 1 char off the end, but not 2+ */
+                /* locinput is allowed to go 1 char off the end (signifying
+                 * EOS), but not 2+ */
                 if (locinput > reginfo->strend)
                     sayNO;
             }