diff options
Diffstat (limited to 'generic/tclEnsemble.c')
| -rw-r--r-- | generic/tclEnsemble.c | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c index 1a2fa14..7c4c5f4 100644 --- a/generic/tclEnsemble.c +++ b/generic/tclEnsemble.c @@ -312,7 +312,17 @@ TclNamespaceEnsembleCmd( Tcl_AppendObjToObj(newCmd, listv[0]); Tcl_ListObjReplace(NULL, newList, 0, 1, 1, &newCmd); if (patchedDict == NULL) { - patchedDict = Tcl_DuplicateObj(objv[1]); + patchedDict = TclDuplicatePureObj( + interp, objv[1], &tclDictType); + if (!patchedDict) { + if (allocatedMapFlag) { + Tcl_DecrRefCount(mapObj); + } + Tcl_DecrRefCount(newList); + Tcl_DecrRefCount(newCmd); + Tcl_DecrRefCount(patchedDict); + return TCL_ERROR; + } } Tcl_DictObjPut(NULL, patchedDict, subcmdWordsObj, newList); @@ -596,7 +606,14 @@ TclNamespaceEnsembleCmd( } cmd = TclGetString(listv[0]); if (!(cmd[0] == ':' && cmd[1] == ':')) { - Tcl_Obj *newList = Tcl_DuplicateObj(listObj); + Tcl_Obj *newList = TclDuplicatePureObj( + interp, listObj, &tclListType.objType); + if (!newList) { + if (patchedDict) { + Tcl_DecrRefCount(patchedDict); + } + goto freeMapAndError; + } Tcl_Obj *newCmd = NewNsObj((Tcl_Namespace*)nsPtr); if (nsPtr->parentPtr) { @@ -606,7 +623,11 @@ TclNamespaceEnsembleCmd( Tcl_ListObjReplace(NULL, newList, 0, 1, 1, &newCmd); if (patchedDict == NULL) { - patchedDict = Tcl_DuplicateObj(objv[1]); + patchedDict = TclDuplicatePureObj( + interp, objv[1], &tclListType.objType); + if (!patchedDict) { + goto freeMapAndError; + } } Tcl_DictObjPut(NULL, patchedDict, subcmdWordsObj, newList); @@ -1904,7 +1925,11 @@ NsEnsembleImplementationCmdNR( TclListObjLengthM(NULL, prefixObj, &prefixObjc); if (objc == 2) { - copyPtr = TclListObjCopy(NULL, prefixObj); + copyPtr = TclDuplicatePureObj( + interp, prefixObj, &tclListType.objType); + if (!copyPtr) { + return TCL_ERROR; + } } else { copyPtr = Tcl_NewListObj(objc - 2 + prefixObjc, NULL); Tcl_ListObjAppendList(NULL, copyPtr, prefixObj); @@ -2304,7 +2329,11 @@ EnsembleUnknownCallback( * Create the "unknown" command callback to determine what to do. */ - unknownCmd = Tcl_DuplicateObj(ensemblePtr->unknownHandler); + unknownCmd = TclDuplicatePureObj( + interp, ensemblePtr->unknownHandler, &tclListType.objType); + if (!unknownCmd) { + return TCL_ERROR; + } TclNewObj(ensObj); Tcl_GetCommandFullName(interp, ensemblePtr->token, ensObj); Tcl_ListObjAppendElement(NULL, unknownCmd, ensObj); |
