From fdd38d24fb5bcfd5779ed198bc00b3e9ff5d7840 Mon Sep 17 00:00:00 2001 From: Kevin B Kenny Date: Mon, 3 May 2004 18:01:21 +0000 Subject: * win/tclWin32Dll.c (TclpCheckStackSpace): * tests/stack.test (stack-3.1): Fix for undetected stack overflow in TclReExec on Windows. [Bug 947070] --- ChangeLog | 6 ++++++ tests/stack.test | 32 +++++++++++++++++++++++++++++++- win/tclWinInt.h | 4 ++-- 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 + + * 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 * 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 -- cgit v0.12