summaryrefslogtreecommitdiffstats
path: root/generic/tclListObj.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2015-11-30 18:38:33 (GMT)
committerdgp <dgp@users.sourceforge.net>2015-11-30 18:38:33 (GMT)
commit4730ab13c85c594c7d72b993b67fee80ffe28c26 (patch)
tree06182e3dbddd3793990aeb70fecd973dd73dbac9 /generic/tclListObj.c
parent48abc4faa37b34ffbe405b86425aa8415da29e88 (diff)
parenta90dcf7e3dbae2714513cbc09ec978dfcf21aa55 (diff)
downloadtcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.zip
tcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.tar.gz
tcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.tar.bz2
merge 8.5
Diffstat (limited to 'generic/tclListObj.c')
-rw-r--r--generic/tclListObj.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/generic/tclListObj.c b/generic/tclListObj.c
index 289cf2d..c4b5cfc 100644
--- a/generic/tclListObj.c
+++ b/generic/tclListObj.c
@@ -854,8 +854,13 @@ Tcl_ListObjReplace(
count = numElems - first;
}
+ if (objc > LIST_MAX - (numElems - count)) {
+ Tcl_SetObjResult(interp, Tcl_ObjPrintf(
+ "max length of a Tcl list (%d elements) exceeded", LIST_MAX));
+ return TCL_ERROR;
+ }
isShared = (listRepPtr->refCount > 1);
- numRequired = numElems - count + objc;
+ numRequired = numElems - count + objc; /* Known <= LIST_MAX */
for (i = 0; i < objc; i++) {
Tcl_IncrRefCount(objv[i]);
@@ -906,6 +911,8 @@ Tcl_ListObjReplace(
listRepPtr = AttemptNewList(interp, newMax, NULL);
if (listRepPtr == NULL) {
+ listRepPtr = AttemptNewList(interp, numRequired, NULL);
+ if (listRepPtr == NULL) {
for (i = 0; i < objc; i++) {
/* See bug 3598580 */
#if TCL_MAJOR_VERSION > 8
@@ -916,6 +923,7 @@ Tcl_ListObjReplace(
}
return TCL_ERROR;
}
+ }
listPtr->internalRep.twoPtrValue.ptr1 = (void *) listRepPtr;
listRepPtr->refCount++;