From d0c5df9ca126ccd1dbc40f75e33b016859d0bfe6 Mon Sep 17 00:00:00 2001 From: oharboe Date: Sun, 16 Aug 2009 11:37:03 +0000 Subject: 2009-08-16 Steve Bennett * jim.c/h: If an object is used in subst, then source, a crash will result --- ChangeLog | 1 + jim.c | 8 ++++++-- jim.h | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index e89b906..0019bcb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2009-08-16 Steve Bennett + * jim.c/h: If an object is used in subst, then source, a crash will result * jimsh.c: A script exiting with 'exit 0' would not give a return code of 0 * jim.c: Make [format %c 0] work (embedded nulls) * jim-array-1.0.tcl: array unset was broken diff --git a/jim.c b/jim.c index 4708054..9f75861 100644 --- a/jim.c +++ b/jim.c @@ -3012,6 +3012,7 @@ int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) script->commands = 0; script->token = NULL; script->cmdStruct = NULL; + script->substFlags = 0; script->inUse = 1; /* Try to get information about filename / line number */ if (objPtr->typePtr == &sourceObjType) { @@ -3116,12 +3117,15 @@ int SetScriptFromAny(Jim_Interp *interp, struct Jim_Obj *objPtr) Jim_FreeIntRep(interp, objPtr); Jim_SetIntRepPtr(objPtr, script); objPtr->typePtr = &scriptObjType; + return JIM_OK; } ScriptObj *Jim_GetScript(Jim_Interp *interp, Jim_Obj *objPtr) { - if (objPtr->typePtr != &scriptObjType) { + struct ScriptObj *script = Jim_GetIntRepPtr(objPtr); + + if (objPtr->typePtr != &scriptObjType || script->substFlags) { SetScriptFromAny(interp, objPtr); } return (ScriptObj*) Jim_GetIntRepPtr(objPtr); @@ -11617,7 +11621,7 @@ static int Jim_LoadCoreCommand(Jim_Interp *interp, int argc, static int Jim_SubstCoreCommand(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - int i, flags = 0; + int i, flags = JIM_SUBST_FLAG; Jim_Obj *objPtr; if (argc < 2) { diff --git a/jim.h b/jim.h index 7ee8235..b9e4d7b 100644 --- a/jim.h +++ b/jim.h @@ -3,7 +3,7 @@ * Copyright 2005 Salvatore Sanfilippo * Copyright 2005 Clemens Hintze * Copyright 2005 patthoyts - Pat Thoyts - * Copyright 2008 oharboe - Øyvind Harboe - oyvind.harboe@zylin.com + * Copyright 2008 oharboe - �yvind Harboe - oyvind.harboe@zylin.com * Copyright 2008 Andrew Lunn * Copyright 2008 Duane Ellis * Copyright 2008 Uwe Klein @@ -176,6 +176,7 @@ extern "C" { #define JIM_SUBST_NOVAR 1 /* don't perform variables substitutions */ #define JIM_SUBST_NOCMD 2 /* don't perform command substitutions */ #define JIM_SUBST_NOESC 4 /* don't perform escapes substitutions */ +#define JIM_SUBST_FLAG 128 /* flag to indicate that this is a real substition object */ /* Unused arguments generate annoying warnings... */ #define JIM_NOTUSED(V) ((void) V) -- cgit v1.1