aboutsummaryrefslogtreecommitdiff
path: root/jim.c
diff options
context:
space:
mode:
authoroharboe <oharboe>2008-11-07 06:59:26 +0000
committeroharboe <oharboe>2008-11-07 06:59:26 +0000
commit28d407ceb6f5865e8d5621136eead9b3eff0dc00 (patch)
tree75aed1df6a697d815abccf301ec458f73b2a22ca /jim.c
parent3fca2f6819789d79cb2b3df742e3b2231f21f756 (diff)
downloadjimtcl-28d407ceb6f5865e8d5621136eead9b3eff0dc00.zip
jimtcl-28d407ceb6f5865e8d5621136eead9b3eff0dc00.tar.gz
jimtcl-28d407ceb6f5865e8d5621136eead9b3eff0dc00.tar.bz2
* jim.c, jim.h: Prevent infinite recursion if an unknown command is
called from unknown
Diffstat (limited to 'jim.c')
-rw-r--r--jim.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/jim.c b/jim.c
index eea9bd3..b859939 100644
--- a/jim.c
+++ b/jim.c
@@ -4436,6 +4436,7 @@ Jim_Interp *Jim_CreateInterp(void)
i->result = i->emptyObj;
i->stackTrace = Jim_NewListObj(i, NULL, 0);
i->unknown = Jim_NewStringObj(i, "unknown", -1);
+ i->unknown_called = 0;
Jim_IncrRefCount(i->emptyObj);
Jim_IncrRefCount(i->result);
Jim_IncrRefCount(i->stackTrace);
@@ -8325,6 +8326,13 @@ static int JimUnknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
Jim_Obj **v, *sv[JIM_EVAL_SARGV_LEN];
int retCode;
+ /* If JimUnknown() is recursively called (e.g. error in the unknown proc,
+ * done here
+ */
+ if (interp->unknown_called) {
+ return JIM_ERR;
+ }
+
/* If the [unknown] command does not exists returns
* just now */
if (Jim_GetCommand(interp, interp->unknown, JIM_NONE) == NULL)
@@ -8345,7 +8353,10 @@ static int JimUnknown(Jim_Interp *interp, int argc, Jim_Obj *const *argv)
memcpy(v+1, argv, sizeof(Jim_Obj*)*argc);
v[0] = interp->unknown;
/* Call it */
+ interp->unknown_called++;
retCode = Jim_EvalObjVector(interp, argc+1, v);
+ interp->unknown_called--;
+
/* Clean up */
if (v != sv)
Jim_Free(v);