diff options
author | dgp <dgp@users.sourceforge.net> | 2015-11-30 18:38:33 (GMT) |
---|---|---|
committer | dgp <dgp@users.sourceforge.net> | 2015-11-30 18:38:33 (GMT) |
commit | 4730ab13c85c594c7d72b993b67fee80ffe28c26 (patch) | |
tree | 06182e3dbddd3793990aeb70fecd973dd73dbac9 /generic/tclListObj.c | |
parent | 48abc4faa37b34ffbe405b86425aa8415da29e88 (diff) | |
parent | a90dcf7e3dbae2714513cbc09ec978dfcf21aa55 (diff) | |
download | tcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.zip tcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.tar.gz tcl-4730ab13c85c594c7d72b993b67fee80ffe28c26.tar.bz2 |
merge 8.5
Diffstat (limited to 'generic/tclListObj.c')
-rw-r--r-- | generic/tclListObj.c | 10 |
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++; |