aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Bennett <steveb@workware.net.au>2012-08-19 10:32:36 +1000
committerSteve Bennett <steveb@workware.net.au>2012-08-19 10:49:26 +1000
commitdf598a649b8aa8d52e1ce7fbdd2fb745592858f2 (patch)
tree8d25e07c91d99838f97fc3a1539964befb6bde47
parentcc366598cfbf40266d700c9e554fe21ece78dc78 (diff)
downloadjimtcl-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.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/jim.c b/jim.c
index aa17e1e..cb279b0 100644
--- a/jim.c
+++ b/jim.c
@@ -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]);
}