summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorapnadkarni <apnmbx-wits@yahoo.com>2023-04-26 14:56:21 (GMT)
committerapnadkarni <apnmbx-wits@yahoo.com>2023-04-26 14:56:21 (GMT)
commit5ddcd8fea990af78cce1ef7d706e0a0ce81a317b (patch)
tree316e5bcda1d720300409a35f4bb478e86bbdc44a
parent025b74f7c7add01c5ca6654b03c29241c0845def (diff)
downloadtcl-5ddcd8fea990af78cce1ef7d706e0a0ce81a317b.zip
tcl-5ddcd8fea990af78cce1ef7d706e0a0ce81a317b.tar.gz
tcl-5ddcd8fea990af78cce1ef7d706e0a0ce81a317b.tar.bz2
Fix for [7cddd2845c] (in progress)
-rw-r--r--generic/tclExecute.c20
-rw-r--r--tests/bigdata.test20
2 files changed, 35 insertions, 5 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 31a8695..1e16d68 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -981,10 +981,10 @@ GrowEvaluationStack(
{
ExecStack *esPtr = eePtr->execStackPtr, *oldPtr = NULL;
size_t newBytes;
- int growth = growth1;
- int newElems, currElems, needed = growth - (esPtr->endPtr - esPtr->tosPtr);
+ Tcl_Size growth = growth1;
+ Tcl_Size newElems, currElems, needed = growth - (esPtr->endPtr - esPtr->tosPtr);
Tcl_Obj **markerPtr = esPtr->markerPtr, **memStart;
- int moveWords = 0;
+ Tcl_Size moveWords = 0;
if (move) {
if (!markerPtr) {
@@ -2825,8 +2825,20 @@ TEBCresume(
pc += pcAdjustment;
TEBC_YIELD();
- return TclNREvalObjv(interp, objc, objv,
+ if (objc > INT_MAX) {
+ if (interp) {
+ Tcl_SetObjResult(
+ interp,
+ Tcl_ObjPrintf("Argument count %" TCL_SIZE_MODIFIER
+ "d exceeds limit %d.",
+ objc,
+ (int)INT_MAX));
+ }
+ return TCL_ERROR;
+ } else {
+ return TclNREvalObjv(interp, objc, objv,
TCL_EVAL_NOERR | TCL_EVAL_SOURCE_IN_FRAME, NULL);
+ }
case INST_INVOKE_REPLACE:
objc = TclGetUInt4AtPtr(pc+1);
diff --git a/tests/bigdata.test b/tests/bigdata.test
index c02d8e3..87c5a59 100644
--- a/tests/bigdata.test
+++ b/tests/bigdata.test
@@ -879,7 +879,8 @@ bigtest linsert-bigdata-1 "linsert" {4294967330 1} -body {
#
# list and {*}
-bigtestRO list-bigdata-1 {list {*} } {4294967296 0 4294967295} -body {
+# TODO - compiled and uncompiled behave differently so tested separately
+bigtestRO xxlist-bigdata-1 {list {*} } {4294967296 0 4294967295} -body {
unset -nocomplain l2
set l2 [list {*}$l]
list [llength $l2] [lindex $l2 0] [lindex $l2 end]
@@ -888,6 +889,23 @@ bigtestRO list-bigdata-1 {list {*} } {4294967296 0 4294967295} -body {
} -cleanup {
bigClean
} -constraints bug-7cddd2845c
+test list-bigdata-1.compiled {list {*} } -body {
+ set l [bigList 0x100000000]
+ set l2 [list {*}$l]
+ unset l
+ list [llength $l2] [lindex $l2 0] [lindex $l2 end]
+} -cleanup {
+ bigClean
+} -result {4294967296 0 5}
+test list-bigdata-1.uncompiled {list {*} } -body {
+ set l [bigList 0x7fffffff]
+ testevalex {set l2 [list {*}$l]}
+ unset l
+ list [llength $l2] [lindex $l2 0] [lindex $l2 end]
+} -cleanup {
+ bigClean
+} -result {4294967296 0 5}
+
#
# llength