Index: generic/xotcl.c =================================================================== diff -u -r782b1f820f03b0f09c3e333a5e03f9ad2808fcac -ra8184b70f4ea9da58c1571356b9b910745a6d5d6 --- generic/xotcl.c (.../xotcl.c) (revision 782b1f820f03b0f09c3e333a5e03f9ad2808fcac) +++ generic/xotcl.c (.../xotcl.c) (revision a8184b70f4ea9da58c1571356b9b910745a6d5d6) @@ -5048,6 +5048,16 @@ } static int +CheckVarName(Tcl_Interp *interp, const char *varNameString) { + if (strstr(varNameString, "::") || *varNameString == ':') { + return XOTclVarErrMsg(interp, "variable name \"", varNameString, + "\" must not contain namespace separator or colon prefix", + (char *) NULL); + } + return TCL_OK; +} + +static int varExists(Tcl_Interp *interp, XOTclObject *object, CONST char *varName, CONST char *index, int triggerTrace, int requireDefined) { Tcl_CallFrame frame, *framePtr = &frame; @@ -8463,7 +8473,6 @@ return result; } - static int GetInstVarIntoCurrentScope(Tcl_Interp *interp, const char *cmdName, XOTclObject *object, Tcl_Obj *varName, Tcl_Obj *newName) { @@ -8473,6 +8482,10 @@ Tcl_CallFrame frame, *framePtr = &frame; char *varNameString; + if (CheckVarName(interp, ObjStr(varName)) != TCL_OK) { + return TCL_ERROR; + } + XOTcl_PushFrameObj(interp, object, framePtr); if (object->nsPtr) { flgs = flgs|TCL_NAMESPACE_ONLY; @@ -8508,12 +8521,8 @@ } varNameString = ObjStr(newName); - if (strstr(varNameString, "::") || *varNameString == ':') { - return XOTclVarErrMsg(interp, "variable name \"", varNameString, - "\" must not contain namespace separator or colon prefix", - (char *) NULL); - } + varFramePtr = (Tcl_CallFrame *)Tcl_Interp_varFramePtr(interp); /* @@ -10963,8 +10972,11 @@ {-argName "var" -required 1} } */ -static int XOTclExistsVarCmd(Tcl_Interp *interp, XOTclObject *object, CONST char *var) { - Tcl_SetIntObj(Tcl_GetObjResult(interp), varExists(interp, object, var, NULL, 1, 1)); +static int XOTclExistsVarCmd(Tcl_Interp *interp, XOTclObject *object, CONST char *varName) { + if (CheckVarName(interp, varName) != TCL_OK) { + return TCL_ERROR; + } + Tcl_SetIntObj(Tcl_GetObjResult(interp), varExists(interp, object, varName, NULL, 1, 1)); return TCL_OK; } @@ -12132,6 +12144,9 @@ } */ static int XOTclSetVarCmd(Tcl_Interp *interp, XOTclObject *object, Tcl_Obj *variable, Tcl_Obj *valueObj) { + if (CheckVarName(interp, ObjStr(variable)) != TCL_OK) { + return TCL_ERROR; + } return setInstVar(interp, object, variable, valueObj); }