summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Zakharevich <ilya@math.berkeley.edu>1998-07-17 09:55:38 -0400
committerGurusamy Sarathy <gsar@cpan.org>1998-07-19 06:58:55 +0000
commit2beec16e955b826c44eaea93f62e1ff554d4c42a (patch)
tree53f8221177a36b065cfa16a2a7bc29f5eea9e49b
parentc12982c86a2196a797f6a6b78ff87ba73a7de7fe (diff)
downloadperl-2beec16e955b826c44eaea93f62e1ff554d4c42a.tar.gz
fix flawed substitution-loop detection on zero-length matches
Message-Id: <199807171755.NAA27720@monk.mps.ohio-state.edu> Subject: [PATCH 5.004_72] Substitution loop in devel branch p4raw-id: //depot/perl@1560
-rw-r--r--pp_hot.c4
-rwxr-xr-xt/op/subst.t6
2 files changed, 8 insertions, 2 deletions
diff --git a/pp_hot.c b/pp_hot.c
index 3ecb5b3e40..d2a7af53d8 100644
--- a/pp_hot.c
+++ b/pp_hot.c
@@ -1590,7 +1590,9 @@ PP(pp_subst)
DIE("panic: do_subst");
strend = s + len;
- maxiters = (strend - s) + 10;
+ maxiters = 2*(strend - s) + 10; /* We can match twice at each
+ position, once with zero-length,
+ second time with non-zero. */
if (!rx->prelen && curpm) {
pm = curpm;
diff --git a/t/op/subst.t b/t/op/subst.t
index 57a956dda6..2d42eeb386 100755
--- a/t/op/subst.t
+++ b/t/op/subst.t
@@ -6,7 +6,7 @@ BEGIN {
@INC = '../lib' if -d '../lib';
}
-print "1..70\n";
+print "1..71\n";
$x = 'foo';
$_ = "x";
@@ -302,3 +302,7 @@ s{ \d+ \b [,.;]? (?{ 'digits' })
}{$^R}xg;
print ($_ eq $foo ? "ok 70\n" : "not ok 70\n#'$_'\n#'$foo'\n");
+$_ = 'x' x 20;
+s/\d*|x/<$&>/g;
+$foo = '<>' . ('<x><>' x 20) ;
+print ($_ eq $foo ? "ok 71\n" : "not ok 71\n#'$_'\n#'$foo'\n");