From fb94c85b04ceff320389ca368f3874e34fe53d13 Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Wed, 27 Sep 2006 15:11:25 +0000 Subject: [PATCH] Bug 339947 - Java XPCOM proxies can get used (resurrected) after having been garbage collected causing VM crash. XULRunner only. patch by ttudor/jhpedemonte, r=jhpedemonte. Original committer: pedemont%us.ibm.com Original revision: 1.8 Original date: 2006/06/06 17:13:18 git-svn-id: svn://10.0.0.236/trunk@212516 18797224-902f-48f8-a5cc-f745e15eee43 --- .../java/xpcom/src/nsJavaXPTCStubWeakRef.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/mozilla/extensions/java/xpcom/src/nsJavaXPTCStubWeakRef.cpp b/mozilla/extensions/java/xpcom/src/nsJavaXPTCStubWeakRef.cpp index 7cdb4a98028..cb98fc9bd78 100644 --- a/mozilla/extensions/java/xpcom/src/nsJavaXPTCStubWeakRef.cpp +++ b/mozilla/extensions/java/xpcom/src/nsJavaXPTCStubWeakRef.cpp @@ -60,12 +60,17 @@ nsJavaXPTCStubWeakRef::nsJavaXPTCStubWeakRef(jobject aJavaObject, nsJavaXPTCStub* aXPTCStub) : mXPTCStub(aXPTCStub) { - mWeakRef = GetJNIEnv()->NewWeakGlobalRef(aJavaObject); + JNIEnv* env = GetJNIEnv(); + jobject weakref = env->NewObject(weakReferenceClass, + weakReferenceConstructorMID, aJavaObject); + mWeakRef = env->NewGlobalRef(weakref); } nsJavaXPTCStubWeakRef::~nsJavaXPTCStubWeakRef() { - GetJNIEnv()->DeleteWeakGlobalRef(mWeakRef); + JNIEnv* env = GetJNIEnv(); + env->CallVoidMethod(mWeakRef, clearReferentMID); + env->DeleteGlobalRef(mWeakRef); mXPTCStub->ReleaseWeakRef(); } @@ -82,8 +87,9 @@ nsJavaXPTCStubWeakRef::QueryReferent(const nsIID& aIID, void** aInstancePtr) // Is weak ref still valid? // We create a strong local ref to make sure Java object isn't garbage // collected during this call. - jobject javaObject = GetJNIEnv()->NewLocalRef(mWeakRef); - if (!javaObject) + JNIEnv* env = GetJNIEnv(); + jobject javaObject = env->CallObjectMethod(mWeakRef, getReferentMID); + if (env->IsSameObject(javaObject, NULL)) return NS_ERROR_NULL_POINTER; // Java object has not been garbage collected, so return QI from XPTCStub.