From 372146cde9bee9ad810ca27744f67e09a3aa89a8 Mon Sep 17 00:00:00 2001 From: Dorai Sitaram Date: Mon, 25 Apr 2005 15:52:34 +0000 Subject: [PATCH] Disallow greedy quantifiers from having empty operands in order to stave off infinite loops. original commit: d9c96724bdb2425e802a3360ceaa7ba4f02ab679 --- collects/mzlib/pregexp.ss | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/collects/mzlib/pregexp.ss b/collects/mzlib/pregexp.ss index d0870a7..bc99127 100644 --- a/collects/mzlib/pregexp.ss +++ b/collects/mzlib/pregexp.ss @@ -520,10 +520,20 @@ (let* ((maximal? (not (cadr re))) (p (caddr re)) (q (cadddr re)) + (could-loop-infinitely? (and maximal? (not q))) (re (car (cddddr re)))) (let loup-p ((k 0) (i i)) (if (< k p) - (sub re i (lambda (i1) (loup-p (+ k 1) i1)) fk) + (sub + re + i + (lambda (i1) + (if (and could-loop-infinitely? (= i1 i)) + (error + 'pregexp-match-positions-aux + 'greedy-quantifier-operand-could-be-empty)) + (loup-p (+ k 1) i1)) + fk) (let ((q (and q (- q p)))) (let loup-q ((k 0) (i i)) (let ((fk (lambda () (sk i)))) @@ -533,7 +543,12 @@ (sub re i - (lambda (i1) (or (loup-q (+ k 1) i1) (fk))) + (lambda (i1) + (if (and could-loop-infinitely? (= i1 i)) + (error + 'pregexp-match-positions-aux + 'greedy-quantifier-operand-could-be-empty)) + (or (loup-q (+ k 1) i1) (fk))) fk) (or (fk) (sub