Tcl Source Code

Artifact [550e5b3a6c]
Login

Artifact 550e5b3a6c1fcaf54f882d4c21e2921500400547:

Attachment "1810038.patch" to ticket [1810038fff] added by dgp 2007-11-16 04:32:23.
Index: generic/regc_nfa.c
===================================================================
RCS file: /cvsroot/tcl/tcl/generic/regc_nfa.c,v
retrieving revision 1.9
diff -u -r1.9 regc_nfa.c
--- generic/regc_nfa.c	15 Nov 2007 17:07:11 -0000	1.9
+++ generic/regc_nfa.c	15 Nov 2007 21:31:14 -0000
@@ -859,6 +859,25 @@
     }
 
     /*
+     * DGP 2007-11-15: Cloning a state with a circular constraint on its list
+     * of outs can lead to trouble [Bug 1810038], so get rid of them first.
+     */
+
+    for (a = from->outs; a != NULL; a = nexta) {
+	nexta = a->outchain;
+	switch (a->type) {
+	case '^':
+	case '$':
+	case BEHIND:
+	case AHEAD:
+	    if (from == a->to) {
+		freearc(nfa, a);
+	    }
+	    break;
+	}
+    }
+
+    /*
      * First, clone from state if necessary to avoid other outarcs.
      */
 
@@ -997,6 +1016,28 @@
     }
 
     /*
+     * DGP 2007-11-15: Here we duplicate the same protections as appear
+     * in pull() above to avoid troubles with cloning a state with a
+     * circular constraint on its list of ins.  It is not clear whether
+     * this is necessary, or is protecting against a "can't happen".
+     * Any test case that actually leads to a freearc() call here would
+     * be a welcome addition to the test suite.
+     */
+
+    for (a = to->ins; a != NULL; a = nexta) {
+	nexta = a->inchain;
+	switch (a->type) {
+	case '^':
+	case '$':
+	case BEHIND:
+	case AHEAD:
+	    if (a->from == to) {
+		freearc(nfa, a);
+	    }
+	    break;
+	}
+    }
+    /*
      * First, clone to state if necessary to avoid other inarcs.
      */
 
Index: tests/regexp.test
===================================================================
RCS file: /cvsroot/tcl/tcl/tests/regexp.test,v
retrieving revision 1.27
diff -u -r1.27 regexp.test
--- tests/regexp.test	10 May 2005 18:35:23 -0000	1.27
+++ tests/regexp.test	15 Nov 2007 21:31:15 -0000
@@ -655,6 +655,11 @@
 } {{0 -1} {2 1} {4 3}}
 
 
+test regexp-22.1 {Bug 1810038} {
+    regexp ($|^X)* {}
+} 1
+
+
 # cleanup
 ::tcltest::cleanupTests
 return