[Mono-bugs] [Bug 72989][Blo] Changed - Stack overflw in RegularExpression parsing

bugzilla-daemon@bugzilla.ximian.com bugzilla-daemon@bugzilla.ximian.com
Wed, 2 Mar 2005 14:12:47 -0500 (EST)

Please do not reply to this email- if you want to comment on the bug, go to the
URL shown below and enter your comments there.

Changed by eyala@mainsoft.com.


--- shadow/72989	2005-02-27 06:33:48.000000000 -0500
+++ shadow/72989.tmp.4728	2005-03-02 14:12:47.000000000 -0500
@@ -130,6 +130,36 @@
 ------- Additional Comments From gonzalo@ximian.com  2005-02-27 06:22 -------
 The patch is not a big deal, but make mono live longer with your test.
 ------- Additional Comments From gonzalo@ximian.com  2005-02-27 06:33 -------
 *** Bug 60550 has been marked as a duplicate of this bug. ***
+------- Additional Comments From eyala@mainsoft.com  2005-03-02 14:12 -------
+I still see the stack overflow happening using the test case. Is 
+there something I am missing? I have applied the patch to the Mono 
+latest version of interpreter.cs and it did not help. It could be 
+since I am not using Mono but am testing agains the .Net CLR, so 
+please test that as well.
+The code flow as I understand it now is that for handling a '*' 
+operator that is applied on an expression (I'll call it a repeat 
+expression) then the code will match the repeat expression once and 
+use a recursion to repeatedly match the input with the repeat 
+expression and the expressions that follow it.
+In the scenario attached here the repeat expression matches one 
+character at a time (it is the last part ([^;]) that is successful 
+every time) and then goes into recursion once for EVERY character. 
+This is indeed too much
+for every character there is a recursions to check if it matches the 
+repeat expression (the most outer expression that is repeatedly 
+matched using '*'). Since every character in the example string 
+matches the last part within the repeat expression ([^;]) then the 
+code goes again into recursion to see if it can continue to match. 
+The changes you made did not affect this behaviour.
+A change that will not recurse every time it matches the repeat 
+expression will resolve the problem. The goal is to have the 
+recursion level being proportional to the regular expression and not 
+to the input.
+Could you give me an explanation of the code in order for me to make 
+such a change? I'd like to implement the following logic:
+for (;;) {