diff options
author | oharboe <oharboe> | 2008-11-07 06:59:26 +0000 |
---|---|---|
committer | oharboe <oharboe> | 2008-11-07 06:59:26 +0000 |
commit | 28d407ceb6f5865e8d5621136eead9b3eff0dc00 (patch) | |
tree | 75aed1df6a697d815abccf301ec458f73b2a22ca /jim.c | |
parent | 3fca2f6819789d79cb2b3df742e3b2231f21f756 (diff) | |
download | jimtcl-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.c | 11 |
1 files changed, 11 insertions, 0 deletions
@@ -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); |