diff options
author | Steve Bennett <steveb@workware.net.au> | 2012-08-19 10:32:36 +1000 |
---|---|---|
committer | Steve Bennett <steveb@workware.net.au> | 2012-08-19 10:49:26 +1000 |
commit | df598a649b8aa8d52e1ce7fbdd2fb745592858f2 (patch) | |
tree | 8d25e07c91d99838f97fc3a1539964befb6bde47 | |
parent | cc366598cfbf40266d700c9e554fe21ece78dc78 (diff) | |
download | jimtcl-df598a649b8aa8d52e1ce7fbdd2fb745592858f2.zip jimtcl-df598a649b8aa8d52e1ce7fbdd2fb745592858f2.tar.gz jimtcl-df598a649b8aa8d52e1ce7fbdd2fb745592858f2.tar.bz2 |
Fix invalid memory reference during finalisers
Avoid destroying the reference object until after the finaliser
has been run
Signed-off-by: Steve Bennett <steveb@workware.net.au>
-rw-r--r-- | jim.c | 5 |
1 files changed, 4 insertions, 1 deletions
@@ -5270,7 +5270,9 @@ int Jim_Collect(Jim_Interp *interp) /* Drop the reference itself */ /* Avoid the finaliser being freed here */ Jim_IncrRefCount(objv[0]); - Jim_DeleteHashEntry(&interp->references, refId); + /* Don't remove the reference from the hash table just yet + * since that will free refPtr, and hence refPtr->objPtr + */ /* Call the finalizer. Errors ignored. */ oldResult = interp->result; @@ -5278,6 +5280,7 @@ int Jim_Collect(Jim_Interp *interp) Jim_EvalObjVector(interp, 3, objv); Jim_SetResult(interp, oldResult); Jim_DecrRefCount(interp, oldResult); + Jim_DeleteHashEntry(&interp->references, refId); Jim_DecrRefCount(interp, objv[0]); } |