summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin B Kenny <kennykb@acm.org>2004-05-03 18:01:21 (GMT)
committerKevin B Kenny <kennykb@acm.org>2004-05-03 18:01:21 (GMT)
commitfdd38d24fb5bcfd5779ed198bc00b3e9ff5d7840 (patch)
tree4cbee53143faa6b8fca2dc0682d163ad186dc5a5
parent9326437245bec03c6f439aa79c3c9db762056d16 (diff)
downloadtcl-fdd38d24fb5bcfd5779ed198bc00b3e9ff5d7840.zip
tcl-fdd38d24fb5bcfd5779ed198bc00b3e9ff5d7840.tar.gz
tcl-fdd38d24fb5bcfd5779ed198bc00b3e9ff5d7840.tar.bz2
* win/tclWin32Dll.c (TclpCheckStackSpace):
* tests/stack.test (stack-3.1): Fix for undetected stack overflow in TclReExec on Windows. [Bug 947070]
-rw-r--r--ChangeLog6
-rw-r--r--tests/stack.test32
-rw-r--r--win/tclWinInt.h4
3 files changed, 39 insertions, 3 deletions
diff --git a/ChangeLog b/ChangeLog
index 47bf86f..13d21b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2004-05-03 Kevin Kenny <kennykb@acm.org>
+
+ * win/tclWin32Dll.c (TclpCheckStackSpace):
+ * tests/stack.test (stack-3.1): Fix for undetected stack
+ overflow in TclReExec on Windows. [Bug 947070]
+
2004-05-03 Don Porter <dgp@users.sourceforge.net>
* library/init.tcl: Corrected unique prefix matching of
diff --git a/tests/stack.test b/tests/stack.test
index 828352b..f5d849b 100644
--- a/tests/stack.test
+++ b/tests/stack.test
@@ -9,7 +9,7 @@
# See the file "license.terms" for information on usage and redistribution
# of this file, and for a DISCLAIMER OF ALL WARRANTIES.
#
-# RCS: @(#) $Id: stack.test,v 1.15 2002/07/29 00:25:49 msofer Exp $
+# RCS: @(#) $Id: stack.test,v 1.15.2.1 2004/05/03 18:01:36 kennykb Exp $
if {[lsearch [namespace children] ::tcltest] == -1} {
package require tcltest 2
@@ -55,6 +55,36 @@ test stack-2.1 {maxNestingDepth reached on infinite recursion} {minStack2400} {
set msg
} {too many nested evaluations (infinite loop?)}
+# Make sure that there is enough stack to run regexp even if we're
+# close to the recursion limit. [Bug 947070]
+
+test stack-3.1 {enough room for regexp near recursion limit} \
+ -constraints { win } \
+ -setup {
+ set ::limit [interp recursionlimit {} 10000]
+ set ::depth 0
+ proc a { max } {
+ if { [info level] < $max } {
+ set ::depth [info level]
+ a $max
+ } else {
+ regexp {^ ?} x
+ }
+ }
+ list [catch { a 10001 }]
+ incr depth -3
+ set depth2 $depth
+ } -body {
+ list [catch { a $::depth } result] \
+ $result [expr { $::depth2 - $::depth }]
+ } -cleanup {
+ interp recursionlimit {} $::limit
+ } -result {0 1 1}
+
# cleanup
::tcltest::cleanupTests
return
+
+# Local Variables:
+# mode: tcl
+# End:
diff --git a/win/tclWinInt.h b/win/tclWinInt.h
index ce09ce3..7ff2775 100644
--- a/win/tclWinInt.h
+++ b/win/tclWinInt.h
@@ -8,7 +8,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclWinInt.h,v 1.20.2.2 2004/03/21 20:59:28 hobbs Exp $
+ * RCS: @(#) $Id: tclWinInt.h,v 1.20.2.3 2004/05/03 18:01:37 kennykb Exp $
*/
#ifndef _TCLWININT
@@ -27,7 +27,7 @@
* to help avoid overflowing the stack in the case of infinite recursion.
*/
-#define TCL_WIN_STACK_THRESHOLD 0x2000
+#define TCL_WIN_STACK_THRESHOLD 0x8000
#ifdef BUILD_tcl
# undef TCL_STORAGE_CLASS