diff options
| author | Miguel Sofer <miguel.sofer@gmail.com> | 2005-02-10 19:08:09 (GMT) |
|---|---|---|
| committer | Miguel Sofer <miguel.sofer@gmail.com> | 2005-02-10 19:08:09 (GMT) |
| commit | e4f6f17d5608669e0f11a3cbf4d4ad736b1f100c (patch) | |
| tree | 16e762307c2913e4307a68bbf586c4be24c6538e /generic/tclBasic.c | |
| parent | 7369ca815076544a9993acde9fffbf8038270777 (diff) | |
| download | tcl-e4f6f17d5608669e0f11a3cbf4d4ad736b1f100c.zip tcl-e4f6f17d5608669e0f11a3cbf4d4ad736b1f100c.tar.gz tcl-e4f6f17d5608669e0f11a3cbf4d4ad736b1f100c.tar.bz2 | |
* generic/tclBasic.c (Tcl_EvalObjEx):
* tests/basic.test (basic-26.2): preserve the arguments passed to
TEOV in the pure-list branch, in case the list shimmers away. Fix
for [Bug 1119369], reported by Peter MacDonald.
Diffstat (limited to 'generic/tclBasic.c')
| -rw-r--r-- | generic/tclBasic.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c index 1d2c77f..086dfa9 100644 --- a/generic/tclBasic.c +++ b/generic/tclBasic.c @@ -13,7 +13,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclBasic.c,v 1.140 2005/01/28 01:49:50 hobbs Exp $ + * RCS: @(#) $Id: tclBasic.c,v 1.141 2005/02/10 19:08:12 msofer Exp $ */ #include "tclInt.h" @@ -3754,11 +3754,27 @@ Tcl_EvalObjEx(interp, objPtr, flags) * everything into a string and back out again. */ if ((objPtr->typePtr == &tclListType) && /* is a list... */ - (objPtr->bytes == NULL) /* ...without a string rep */) { - register List *listRepPtr = + (objPtr->bytes == NULL) /* ...without a string rep */) { + List *listRepPtr = (List *) objPtr->internalRep.twoPtrValue.ptr1; - result = Tcl_EvalObjv(interp, listRepPtr->elemCount, - listRepPtr->elements, flags); + int i, objc = listRepPtr->elemCount; + Tcl_Obj **objv; + + /* + * Copy the list elements here, to avoid a segfault if objPtr + * loses its List internal rep [Bug 1119369] + */ + + objv = (Tcl_Obj **) TclStackAlloc(interp, objc*sizeof(Tcl_Obj *)); + for (i=0; i < objc; i++) { + objv[i] = listRepPtr->elements[i]; + Tcl_IncrRefCount(objv[i]); + } + result = Tcl_EvalObjv(interp, objc, objv, flags); + for (i=0; i < objc; i++) { + TclDecrRefCount(objv[i]); + } + TclStackFree(interp); } else { script = Tcl_GetStringFromObj(objPtr, &numSrcBytes); result = Tcl_EvalEx(interp, script, numSrcBytes, flags); |
