From b5d494f9040dbe859ca0b2e64fc32bc0cd8fecf2 Mon Sep 17 00:00:00 2001 From: "pedemont%us.ibm.com" Date: Wed, 12 Jan 2005 17:59:01 +0000 Subject: [PATCH] Bug 270889 - Better error handling. r=darin git-svn-id: svn://10.0.0.236/trunk@167603 18797224-902f-48f8-a5cc-f745e15eee43 --- .../java/xpcom/nsAppFileLocProviderProxy.cpp | 26 +- .../java/xpcom/nsJavaInterfaces.cpp | 235 ++++++----- .../extensions/java/xpcom/nsJavaWrapper.cpp | 196 +++++++-- .../java/xpcom/nsJavaXPCOMBindingUtils.cpp | 85 +++- .../java/xpcom/nsJavaXPCOMBindingUtils.h | 31 +- .../extensions/java/xpcom/nsJavaXPTCStub.cpp | 386 ++++++++++++++---- .../java/xpcom/nsJavaXPTCStubWeakRef.cpp | 6 +- 7 files changed, 713 insertions(+), 252 deletions(-) diff --git a/mozilla/extensions/java/xpcom/nsAppFileLocProviderProxy.cpp b/mozilla/extensions/java/xpcom/nsAppFileLocProviderProxy.cpp index 63a33ae8cef..a3954805ca5 100644 --- a/mozilla/extensions/java/xpcom/nsAppFileLocProviderProxy.cpp +++ b/mozilla/extensions/java/xpcom/nsAppFileLocProviderProxy.cpp @@ -61,7 +61,11 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant, { // Setup params for calling Java function jstring prop = mJavaEnv->NewStringUTF(aProp); + if (!prop) + return NS_ERROR_OUT_OF_MEMORY; jbooleanArray persistant = mJavaEnv->NewBooleanArray(1); + if (!persistant) + return NS_ERROR_OUT_OF_MEMORY; // Create method ID jmethodID mid = nsnull; @@ -70,23 +74,26 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant, mid = mJavaEnv->GetMethodID(clazz, "getFile", "(Ljava/lang/String;[Z)Ljava/io/File;"); } + if (!mid) + return NS_ERROR_FAILURE; // Call Java function jobject javaFile = nsnull; - if (mid) { - javaFile = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop, - persistant); - } - if (javaFile == nsnull) { + javaFile = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop, + persistant); + if (javaFile == nsnull || mJavaEnv->ExceptionCheck()) return NS_ERROR_FAILURE; - } // Set boolean output value jboolean isCopy = PR_FALSE; jboolean* array = mJavaEnv->GetBooleanArrayElements(persistant, &isCopy); - *aIsPersistant = array[0]; - if (isCopy) { - mJavaEnv->ReleaseBooleanArrayElements(persistant, array, JNI_ABORT); + if (!array) { + return NS_ERROR_OUT_OF_MEMORY; + } else { + *aIsPersistant = array[0]; + if (isCopy) { + mJavaEnv->ReleaseBooleanArrayElements(persistant, array, JNI_ABORT); + } } // Set nsIFile result value @@ -96,6 +103,7 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant, if (NS_SUCCEEDED(rv)) { return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult); } + return rv; } diff --git a/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp b/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp index 4f2a2b08539..26507d04a3b 100644 --- a/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaInterfaces.cpp @@ -58,8 +58,9 @@ GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory, jobject aAppFileLocProvider) { nsresult rv = NS_OK; - if (InitializeJavaGlobals(env)) - { + if (!InitializeJavaGlobals(env)) { + rv = NS_ERROR_FAILURE; + } else { // Create an nsILocalFile from given java.io.File nsCOMPtr directory; if (aMozBinDirectory) { @@ -70,19 +71,23 @@ GECKO_NATIVE(initEmbedding) (JNIEnv* env, jclass, jobject aMozBinDirectory, nsAppFileLocProviderProxy* provider = nsnull; if (aAppFileLocProvider) { provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); + if (!provider) + rv = NS_ERROR_OUT_OF_MEMORY; } - rv = NS_InitEmbedding(directory, provider); - if (provider) { - delete provider; - } if (NS_SUCCEEDED(rv)) { - return; + rv = NS_InitEmbedding(directory, provider); + if (provider) { + delete provider; + } + if (NS_SUCCEEDED(rv)) { + return; + } } } } - ThrowXPCOMException(env, rv, "Failure in initEmbedding"); + ThrowException(env, rv, "Failure in initEmbedding"); FreeJavaGlobals(env); } @@ -91,7 +96,7 @@ GECKO_NATIVE(termEmbedding) (JNIEnv *env, jclass) { nsresult rv = NS_TermEmbedding(); if (NS_FAILED(rv)) - ThrowXPCOMException(env, rv, "NS_TermEmbedding failed"); + ThrowException(env, rv, "NS_TermEmbedding failed"); FreeJavaGlobals(env); } @@ -101,8 +106,9 @@ XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory, jobject aAppFileLocProvider) { nsresult rv = NS_OK; - if (InitializeJavaGlobals(env)) - { + if (!InitializeJavaGlobals(env)) { + rv = NS_ERROR_FAILURE; + } else { // Create an nsILocalFile from given java.io.File nsCOMPtr directory; if (aMozBinDirectory) { @@ -113,36 +119,41 @@ XPCOM_NATIVE(initXPCOM) (JNIEnv* env, jclass, jobject aMozBinDirectory, nsAppFileLocProviderProxy* provider = nsnull; if (aAppFileLocProvider) { provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider); + if (!provider) + rv = NS_ERROR_OUT_OF_MEMORY; } - nsIServiceManager* servMan = nsnull; - rv = NS_InitXPCOM2(&servMan, directory, provider); - if (provider) { - delete provider; - } - - jobject java_stub = nsnull; if (NS_SUCCEEDED(rv)) { - // wrap xpcom instance - JavaXPCOMInstance* inst; - inst = CreateJavaXPCOMInstance(servMan, &NS_GET_IID(nsIServiceManager)); - NS_RELEASE(servMan); // JavaXPCOMInstance has owning ref + nsIServiceManager* servMan = nsnull; + rv = NS_InitXPCOM2(&servMan, directory, provider); + if (provider) { + delete provider; + } - if (inst) { - // create java stub - java_stub = CreateJavaWrapper(env, "nsIServiceManager"); + jobject java_stub = nsnull; + if (NS_SUCCEEDED(rv)) { + // wrap xpcom instance + JavaXPCOMInstance* inst; + rv = CreateJavaXPCOMInstance(servMan, &NS_GET_IID(nsIServiceManager), + &inst); + NS_RELEASE(servMan); // JavaXPCOMInstance has owning ref - if (java_stub) { - // Associate XPCOM object w/ Java stub - AddJavaXPCOMBinding(env, java_stub, inst); - return java_stub; + if (NS_SUCCEEDED(rv)) { + // create java stub + java_stub = CreateJavaWrapper(env, "nsIServiceManager"); + + if (java_stub) { + // Associate XPCOM object w/ Java stub + AddJavaXPCOMBinding(env, java_stub, inst); + return java_stub; + } } } } } } - ThrowXPCOMException(env, rv, "Failure in initXPCOM"); + ThrowException(env, rv, "Failure in initXPCOM"); FreeJavaGlobals(env); return nsnull; } @@ -155,20 +166,20 @@ XPCOM_NATIVE(shutdownXPCOM) (JNIEnv *env, jclass, jobject aServMgr) // Find corresponding XPCOM object void* xpcomObj = GetMatchingXPCOMObject(env, aServMgr); NS_ASSERTION(xpcomObj != nsnull, "Failed to get matching XPCOM object"); - if (xpcomObj == nsnull) { - ThrowXPCOMException(env, 0, - "No matching XPCOM obj for service manager proxy"); - return; - } - NS_ASSERTION(!IsXPTCStub(xpcomObj), - "Expected JavaXPCOMInstance, but got nsJavaXPTCStub"); - servMgr = do_QueryInterface(((JavaXPCOMInstance*) xpcomObj)->GetInstance()); + // Even if we failed to get the matching xpcom object, we don't abort this + // function. Just call NS_ShutdownXPCOM with a null service manager. + + if (xpcomObj) { + NS_ASSERTION(!IsXPTCStub(xpcomObj), + "Expected JavaXPCOMInstance, but got nsJavaXPTCStub"); + servMgr = do_QueryInterface(((JavaXPCOMInstance*) xpcomObj)->GetInstance()); + } } nsresult rv = NS_ShutdownXPCOM(servMgr); if (NS_FAILED(rv)) - ThrowXPCOMException(env, rv, "NS_ShutdownXPCOM failed"); + ThrowException(env, rv, "NS_ShutdownXPCOM failed"); FreeJavaGlobals(env); } @@ -184,6 +195,8 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath, const PRUnichar* buf = nsnull; if (aPath) { buf = env->GetStringChars(aPath, &isCopy); + if (!buf) + return nsnull; // exception already thrown } nsAutoString path_str(buf); @@ -198,10 +211,10 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath, if (NS_SUCCEEDED(rv)) { // wrap xpcom instance JavaXPCOMInstance* inst; - inst = CreateJavaXPCOMInstance(file, &NS_GET_IID(nsILocalFile)); + rv = CreateJavaXPCOMInstance(file, &NS_GET_IID(nsILocalFile), &inst); NS_RELEASE(file); // JavaXPCOMInstance has owning ref - if (inst) { + if (NS_SUCCEEDED(rv)) { // create java stub java_stub = CreateJavaWrapper(env, "nsILocalFile"); @@ -213,7 +226,7 @@ XPCOM_NATIVE(newLocalFile) (JNIEnv *env, jclass, jstring aPath, } if (java_stub == nsnull) - ThrowXPCOMException(env, rv, "Failure in newLocalFile"); + ThrowException(env, rv, "Failure in newLocalFile"); return java_stub; } @@ -230,10 +243,10 @@ XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jclass) if (NS_SUCCEEDED(rv)) { // wrap xpcom instance JavaXPCOMInstance* inst; - inst = CreateJavaXPCOMInstance(cm, &NS_GET_IID(nsIComponentManager)); + rv = CreateJavaXPCOMInstance(cm, &NS_GET_IID(nsIComponentManager), &inst); NS_RELEASE(cm); // JavaXPCOMInstance has owning ref - if (inst) { + if (NS_SUCCEEDED(rv)) { // create java stub java_stub = CreateJavaWrapper(env, "nsIComponentManager"); @@ -245,7 +258,7 @@ XPCOM_NATIVE(getComponentManager) (JNIEnv *env, jclass) } if (java_stub == nsnull) - ThrowXPCOMException(env, rv, "Failure in getComponentManager"); + ThrowException(env, rv, "Failure in getComponentManager"); return java_stub; } @@ -262,10 +275,10 @@ XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jclass) if (NS_SUCCEEDED(rv)) { // wrap xpcom instance JavaXPCOMInstance* inst; - inst = CreateJavaXPCOMInstance(cr, &NS_GET_IID(nsIComponentRegistrar)); + rv = CreateJavaXPCOMInstance(cr, &NS_GET_IID(nsIComponentRegistrar), &inst); NS_RELEASE(cr); // JavaXPCOMInstance has owning ref - if (inst) { + if (NS_SUCCEEDED(rv)) { // create java stub java_stub = CreateJavaWrapper(env, "nsIComponentRegistrar"); @@ -277,7 +290,7 @@ XPCOM_NATIVE(getComponentRegistrar) (JNIEnv *env, jclass) } if (java_stub == nsnull) - ThrowXPCOMException(env, rv, "Failure in getComponentRegistrar"); + ThrowException(env, rv, "Failure in getComponentRegistrar"); return java_stub; } @@ -294,10 +307,10 @@ XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jclass) if (NS_SUCCEEDED(rv)) { // wrap xpcom instance JavaXPCOMInstance* inst; - inst = CreateJavaXPCOMInstance(sm, &NS_GET_IID(nsIServiceManager)); + rv = CreateJavaXPCOMInstance(sm, &NS_GET_IID(nsIServiceManager), &inst); NS_RELEASE(sm); // JavaXPCOMInstance has owning ref - if (inst) { + if (NS_SUCCEEDED(rv)) { // create java stub java_stub = CreateJavaWrapper(env, "nsIServiceManager"); @@ -309,22 +322,26 @@ XPCOM_NATIVE(getServiceManager) (JNIEnv *env, jclass) } if (java_stub == nsnull) - ThrowXPCOMException(env, rv, "Failure in getServiceManager"); + ThrowException(env, rv, "Failure in getServiceManager"); return java_stub; } extern "C" JNIEXPORT void JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodVoid) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodVoid) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); } extern "C" JNIEXPORT jboolean JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -332,8 +349,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodBool) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT jbooleanArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -341,8 +360,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodBoolA) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jbyte JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -350,8 +371,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodByte) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT jbyteArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -359,8 +382,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodByteA) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jchar JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -368,8 +393,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodChar) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT jcharArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -377,8 +404,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodCharA) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jshort JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -386,8 +415,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodShort) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jshortArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -395,8 +426,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodShortA) (JNIEnv *env, jclass that, jobject aJ } extern "C" JNIEXPORT jint JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -404,8 +437,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodInt) (JNIEnv *env, jclass that, jobject aJava } extern "C" JNIEXPORT jintArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -413,8 +448,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodIntA) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT jlong JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -422,8 +459,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodLong) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT jlongArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -431,8 +470,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodLongA) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jfloat JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -440,8 +481,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloat) (JNIEnv *env, jclass that, jobject aJa } extern "C" JNIEXPORT jfloatArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -449,8 +492,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodFloatA) (JNIEnv *env, jclass that, jobject aJ } extern "C" JNIEXPORT jdouble JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -458,8 +503,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodDouble) (JNIEnv *env, jclass that, jobject aJ } extern "C" JNIEXPORT jdoubleArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -467,8 +514,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodDoubleA) (JNIEnv *env, jclass that, jobject a } extern "C" JNIEXPORT jobject JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -476,8 +525,10 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodObj) (JNIEnv *env, jclass that, jobject aJava } extern "C" JNIEXPORT jobjectArray JNICALL -XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, jobject aJavaObject, - jint aMethodIndex, jobjectArray aParams) +XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, + jobject aJavaObject, + jint aMethodIndex, + jobjectArray aParams) { jvalue rc; CallXPCOMMethod(env, that, aJavaObject, aMethodIndex, aParams, rc); @@ -485,7 +536,8 @@ XPCOMPRIVATE_NATIVE(CallXPCOMMethodObjA) (JNIEnv *env, jclass that, jobject aJav } extern "C" JNIEXPORT void JNICALL -XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, jobject aJavaObject) +XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, + jobject aJavaObject) { #ifdef DEBUG jboolean isCopy; @@ -498,7 +550,8 @@ XPCOMPRIVATE_NATIVE(FinalizeStub) (JNIEnv *env, jclass that, jobject aJavaObject #endif void* obj = GetMatchingXPCOMObject(env, aJavaObject); - NS_ASSERTION(!IsXPTCStub(obj), "Expecting JavaXPCOMInstance, got nsJavaXPTCStub"); + NS_ASSERTION(!IsXPTCStub(obj), + "Expecting JavaXPCOMInstance, got nsJavaXPTCStub"); RemoveJavaXPCOMBinding(env, aJavaObject, nsnull); delete (JavaXPCOMInstance*) obj; } diff --git a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp index 8532a7a5aa5..7422186b299 100644 --- a/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaWrapper.cpp @@ -76,6 +76,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jbyte* buf = nsnull; if (aParam) { buf = env->GetByteArrayElements((jbyteArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -98,6 +102,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jshort* buf = nsnull; if (aParam) { buf = env->GetShortArrayElements((jshortArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -120,6 +128,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jint* buf = nsnull; if (aParam) { buf = env->GetIntArrayElements((jintArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -142,6 +154,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jlong* buf = nsnull; if (aParam) { buf = env->GetLongArrayElements((jlongArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -163,6 +179,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jfloat* buf = nsnull; if (aParam) { buf = env->GetFloatArrayElements((jfloatArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -184,6 +204,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jdouble* buf = nsnull; if (aParam) { buf = env->GetDoubleArrayElements((jdoubleArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -205,6 +229,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jboolean* buf = nsnull; if (aParam) { buf = env->GetBooleanArrayElements((jbooleanArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -230,6 +258,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jchar* buf = nsnull; if (aParam) { buf = env->GetCharArrayElements((jcharArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -261,6 +293,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, } else { buf = env->GetStringChars(data, &isCopy); } + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.val.p = aVariant.ptr = NS_CONST_CAST(void*, buf); @@ -283,10 +319,19 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, } nsID* iid = new nsID; + if (!iid) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (data) { jboolean isCopy; const char* str = nsnull; str = env->GetStringUTFChars(data, &isCopy); + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } + iid->Parse(str); if (isCopy) { env->ReleaseStringUTFChars(data, str); @@ -322,7 +367,7 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, aMethodIndex, aDispatchParams, PR_TRUE, iid); if (NS_FAILED(rv)) - return rv; + break; PRBool isWeakRef = iid.Equals(NS_GET_IID(nsIWeakReference)); @@ -335,10 +380,16 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, // Get interface info for class nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); nsCOMPtr iinfo; - iim->GetInfoForIID(&iid, getter_AddRefs(iinfo)); + rv = iim->GetInfoForIID(&iid, getter_AddRefs(iinfo)); + if (NS_FAILED(rv)) + break; // Create XPCOM stub nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(env, java_obj, iinfo); + if (!xpcomStub) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } inst = SetAsXPTCStub(xpcomStub); AddJavaXPCOMBinding(env, java_obj, inst); } @@ -348,14 +399,20 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, // create it here. nsJavaXPTCStubWeakRef* weakref = new nsJavaXPTCStubWeakRef(env, java_obj); + if (!weakref) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } NS_ADDREF(weakref); aVariant.flags |= nsXPTCVariant::VAL_IS_ALLOCD; aVariant.val.p = aVariant.ptr = (void*) weakref; + } else if (IsXPTCStub(inst)) { nsJavaXPTCStub* xpcomStub = GetXPTCStubAddr(inst); NS_ADDREF(xpcomStub); aVariant.flags |= nsXPTCVariant::VAL_IS_ALLOCD; aVariant.val.p = aVariant.ptr = (void*) xpcomStub; + } else { JavaXPCOMInstance* xpcomInst = (JavaXPCOMInstance*) inst; aVariant.val.p = aVariant.ptr = (void*) xpcomInst->GetInstance(); @@ -382,6 +439,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, } nsAString* str = jstring_to_nsAString(env, data); + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aVariant.val.p = aVariant.ptr = str; aVariant.flags = nsXPTCVariant::PTR_IS_DATA | nsXPTCVariant::VAL_IS_DOMSTR; @@ -401,6 +462,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, } nsACString* str = jstring_to_nsACString(env, data); + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aVariant.val.p = aVariant.ptr = str; aVariant.flags = nsXPTCVariant::PTR_IS_DATA; @@ -424,6 +489,10 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, jint* buf = nsnull; if (aParam) { buf = env->GetIntArrayElements((jintArray) aParam, &isCopy); + if (!buf) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } aVariant.ptr = buf; @@ -433,7 +502,8 @@ SetupParams(JNIEnv *env, const jobject aParam, const nsXPTParamInfo &aParamInfo, } } else { LOG(("int (void*)\n")); - NS_ASSERTION(type.IsPointer(), "T_VOID 'int' handler received non-pointer type"); + NS_ASSERTION(type.IsPointer(), + "T_VOID 'int' handler received non-pointer type"); aVariant.val.p = (void*) env->CallIntMethod(aParam, intValueMID); } } else { @@ -569,6 +639,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam, // If this is an output parameter, then create the string to return if (aParam && aParamInfo.IsOut()) { jstring str = env->NewStringUTF((const char*) aVariant.val.p); + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } env->SetObjectArrayElement((jobjectArray) aParam, 0, str); } } @@ -591,6 +665,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam, if (aParam && aParamInfo.IsOut()) { PRUint32 length = nsCRT::strlen((const PRUnichar*) aVariant.val.p); jstring str = env->NewString((const jchar*) aVariant.val.p, length); + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } env->SetObjectArrayElement((jobjectArray) aParam, 0, str); } } @@ -604,6 +682,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam, if (iid && aParamInfo.IsOut()) { char* iid_str = iid->ToString(); jstring str = env->NewStringUTF(iid_str); + if (!iid_str || !str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } PR_Free(iid_str); env->SetObjectArrayElement((jobjectArray) aParam, 0, str); } @@ -628,21 +710,23 @@ FinalizeParams(JNIEnv *env, const jobject aParam, if (NS_FAILED(rv)) return rv; - nsISupports* variant = - NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p); - inst = CreateJavaXPCOMInstance(variant, &iid); + nsISupports* variant; + variant = NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p); + rv = CreateJavaXPCOMInstance(variant, &iid, &inst); + if (NS_FAILED(rv)) + break; NS_RELEASE(variant); // JavaXPCOMInstance has owning ref - if (inst) { - // create java stub - char* iface_name; - inst->InterfaceInfo()->GetName(&iface_name); - java_obj = CreateJavaWrapper(env, iface_name); + // create java stub + char* iface_name; + rv = inst->InterfaceInfo()->GetName(&iface_name); + if (NS_FAILED(rv)) + break; + java_obj = CreateJavaWrapper(env, iface_name); - if (java_obj) { - // Associate XPCOM object w/ Java stub - AddJavaXPCOMBinding(env, java_obj, inst); - } + if (java_obj) { + // Associate XPCOM object w/ Java stub + AddJavaXPCOMBinding(env, java_obj, inst); } } @@ -666,7 +750,12 @@ FinalizeParams(JNIEnv *env, const jobject aParam, if (str) { if (aParamInfo.IsOut()) { - jstring jstr = env->NewString((const jchar*) str->get(), str->Length()); + jstring jstr; + jstr = env->NewString((const jchar*) str->get(), str->Length()); + if (!jstr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } env->SetObjectArrayElement((jobjectArray) aParam, 0, jstr); } delete str; @@ -682,6 +771,10 @@ FinalizeParams(JNIEnv *env, const jobject aParam, if (str) { if (aParamInfo.IsOut()) { jstring jstr = env->NewStringUTF((const char*) str->get()); + if (!jstr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } env->SetObjectArrayElement((jobjectArray) aParam, 0, jstr); } delete str; @@ -755,10 +848,15 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, case nsXPTType::T_CHAR_STR: { - if (aVariant.ptr) + if (aVariant.ptr) { aResult.l = env->NewStringUTF((const char*) aVariant.ptr); - else + if (aResult.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } + } else { aResult.l = nsnull; + } } break; @@ -767,6 +865,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, if (aVariant.ptr) { PRUint32 length = nsCRT::strlen((const PRUnichar*) aVariant.ptr); aResult.l = env->NewString((const jchar*) aVariant.ptr, length); + if (aResult.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } else { aResult.l = nsnull; } @@ -779,6 +881,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, nsID* iid = (nsID*) aVariant.ptr; char* iid_str = iid->ToString(); aResult.l = env->NewStringUTF(iid_str); + if (iid_str == nsnull || aResult.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } PR_Free(iid_str); } else { aResult.l = nsnull; @@ -800,20 +906,22 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, if (NS_FAILED(rv)) return rv; - nsISupports* variant = - NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p); - inst = CreateJavaXPCOMInstance(variant, &iid); + nsISupports* variant; + variant = NS_REINTERPRET_CAST(nsISupports*, aVariant.val.p); + rv = CreateJavaXPCOMInstance(variant, &iid, &inst); + if (NS_FAILED(rv)) + break; NS_RELEASE(variant); // JavaXPCOMInstance has owning ref - if (inst) { - // create java stub - char* iface_name; - inst->InterfaceInfo()->GetName(&iface_name); - java_obj = CreateJavaWrapper(env, iface_name); + // create java stub + char* iface_name; + rv = inst->InterfaceInfo()->GetName(&iface_name); + if (NS_FAILED(rv)) + break; + java_obj = CreateJavaWrapper(env, iface_name); - if (java_obj) - AddJavaXPCOMBinding(env, java_obj, inst); - } + if (java_obj) + AddJavaXPCOMBinding(env, java_obj, inst); } // XXX not sure if this is necessary @@ -839,6 +947,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, if (aVariant.ptr) { nsString* str = (nsString*) aVariant.ptr; aResult.l = env->NewString(str->get(), str->Length()); + if (aResult.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } else { aResult.l = nsnull; } @@ -851,6 +963,10 @@ SetRetval(JNIEnv *env, const nsXPTParamInfo &aParamInfo, if (aVariant.ptr) { nsCString* str = (nsCString*) aVariant.ptr; aResult.l = env->NewStringUTF(str->get()); + if (aResult.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } else { aResult.l = nsnull; } @@ -882,7 +998,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, // Find corresponding XPCOM object void* xpcomObj = GetMatchingXPCOMObject(env, aJavaObject); if (xpcomObj == nsnull) { - ThrowXPCOMException(env, 0, "Failed to get matching XPCOM object"); + ThrowException(env, 0, "Failed to get matching XPCOM object"); return; } @@ -895,7 +1011,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, nsIInterfaceInfo* iinfo = inst->InterfaceInfo(); nsresult rv = iinfo->GetMethodInfo(aMethodIndex, &methodInfo); if (NS_FAILED(rv)) { - ThrowXPCOMException(env, rv, "GetMethodInfo failed"); + ThrowException(env, rv, "GetMethodInfo failed"); return; } @@ -911,6 +1027,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, if (paramCount) { params = new nsXPTCVariant[paramCount]; + if (!params) { + ThrowException(env, NS_ERROR_OUT_OF_MEMORY, "Can't create params array"); + return; + } for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++) { @@ -928,6 +1048,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, case nsXPTType::T_ASTRING: case nsXPTType::T_DOMSTRING: params[i].val.p = params[i].ptr = new nsString(); + if (params[i].val.p == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } params[i].type = type; params[i].flags = nsXPTCVariant::PTR_IS_DATA | nsXPTCVariant::VAL_IS_DOMSTR; @@ -936,6 +1060,10 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, case nsXPTType::T_UTF8STRING: case nsXPTType::T_CSTRING: params[i].val.p = params[i].ptr = new nsCString(); + if (params[i].val.p == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } params[i].type = type; params[i].flags = nsXPTCVariant::PTR_IS_DATA | nsXPTCVariant::VAL_IS_CSTR; @@ -953,7 +1081,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, } } if (NS_FAILED(rv)) { - ThrowXPCOMException(env, rv, "SetupParams failed"); + ThrowException(env, rv, "SetupParams failed"); return; } } @@ -978,7 +1106,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, } } if (NS_FAILED(rv)) { - ThrowXPCOMException(env, rv, "FinalizeParams failed"); + ThrowException(env, rv, "FinalizeParams/SetRetval failed"); return; } @@ -1006,7 +1134,7 @@ CallXPCOMMethod(JNIEnv *env, jclass that, jobject aJavaObject, nsCAutoString message("The function \""); message.AppendASCII(methodInfo->GetName()); message.AppendLiteral("\" returned an error condition"); - ThrowXPCOMException(env, invokeResult, message.get()); + ThrowException(env, invokeResult, message.get()); } return; diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp index 2168293d17e..4c9756acff2 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.cpp @@ -457,23 +457,26 @@ JavaXPCOMInstance::~JavaXPCOMInstance() NS_ASSERTION(NS_SUCCEEDED(rv), "Failed to release using NS_ProxyRelease"); } -JavaXPCOMInstance* -CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID) +nsresult +CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID, + JavaXPCOMInstance** aResult) { - JavaXPCOMInstance* inst = nsnull; - - // Get interface info for class nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); NS_ASSERTION(iim != nsnull, "Failed to get InterfaceInfoManager"); - if (iim) { - nsCOMPtr info; - iim->GetInfoForIID(aIID, getter_AddRefs(info)); + if (!iim) + return NS_ERROR_FAILURE; - // Wrap XPCOM object - inst = new JavaXPCOMInstance(aXPCOMObject, info); + // Get interface info for class + nsCOMPtr info; + nsresult rv = iim->GetInfoForIID(aIID, getter_AddRefs(info)); + + // Wrap XPCOM object + if (NS_SUCCEEDED(rv)) { + *aResult = new JavaXPCOMInstance(aXPCOMObject, info); + if (!*aResult) + rv = NS_ERROR_OUT_OF_MEMORY; } - - return inst; + return rv; } @@ -496,14 +499,16 @@ GetIIDForMethodParam(nsIInterfaceInfo *iinfo, const nsXPTMethodInfo *methodInfo, PRUint8 argnum; rv = iinfo->GetInterfaceIsArgNumberForParam(methodIndex, ¶mInfo, &argnum); if (NS_FAILED(rv)) - return rv; + break; const nsXPTParamInfo& arg_param = methodInfo->GetParam(argnum); const nsXPTType& arg_type = arg_param.GetType(); // The xpidl compiler ensures this. We reaffirm it for safety. - if (!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID) - return NS_ERROR_UNEXPECTED; + if (!arg_type.IsPointer() || arg_type.TagPart() != nsXPTType::T_IID) { + rv = NS_ERROR_UNEXPECTED; + break; + } nsID *p = nsnull; if (isFullVariantArray) { @@ -530,18 +535,37 @@ GetIIDForMethodParam(nsIInterfaceInfo *iinfo, const nsXPTMethodInfo *methodInfo, *******************************/ void -ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode, - const char* aMessage) +ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage) { // Only throw this exception if one hasn't already been thrown, so we don't // mask a previous exception/error. if (env->ExceptionCheck()) return; + // If the error code we get is for an Out Of Memory error, try to throw an + // OutOfMemoryError. The JVM may have enough memory to create this error. + if (aErrorCode == NS_ERROR_OUT_OF_MEMORY) { + jclass clazz = env->FindClass("java/lang/OutOfMemoryError"); + if (clazz) { + env->ThrowNew(clazz, aMessage); + } + env->DeleteLocalRef(clazz); + return; + } + + // If the error was not handled above, then create an XPCOMException with the + // given error code and message. + // Create parameters and method signature. Max of 2 params. The error code // comes before the message string. PRUint32 index = 0; jvalue* args = new jvalue[2]; + if (!args) { + ThrowException(env, NS_ERROR_OUT_OF_MEMORY, + "Out of memory while throwing another exception"); + return; + } + nsCAutoString methodSig("("); if (aErrorCode) { args[index++].j = aErrorCode; @@ -549,6 +573,10 @@ ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode, } if (aMessage) { args[index].l = env->NewStringUTF(aMessage); + if (args[index].l == nsnull) { + delete[] args; + return; + } methodSig.AppendLiteral("Ljava/lang/String;"); } methodSig.AppendLiteral(")V"); @@ -578,6 +606,8 @@ jstring_to_nsAString(JNIEnv* env, jstring aString) const PRUnichar* buf = nsnull; if (aString) { buf = env->GetStringChars(aString, &isCopy); + if (!buf) + return nsnull; // exception already thrown } nsString* str = new nsString(buf); @@ -585,6 +615,7 @@ jstring_to_nsAString(JNIEnv* env, jstring aString) env->ReleaseStringChars(aString, buf); } + // returns string, or nsnull if 'new' failed return str; } @@ -595,6 +626,8 @@ jstring_to_nsACString(JNIEnv* env, jstring aString) const char* buf = nsnull; if (aString) { buf = env->GetStringUTFChars(aString, &isCopy); + if (!buf) + return nsnull; // exception already thrown } nsCString* str = new nsCString(buf); @@ -602,12 +635,14 @@ jstring_to_nsACString(JNIEnv* env, jstring aString) env->ReleaseStringUTFChars(aString, buf); } + // returns string, or nsnull if 'new' failed return str; } nsresult File_to_nsILocalFile(JNIEnv* env, jobject aFile, nsILocalFile** aLocalFile) { + nsresult rv = NS_ERROR_FAILURE; jstring pathName = nsnull; jclass clazz = env->FindClass("java/io/File"); if (clazz) { @@ -615,16 +650,22 @@ File_to_nsILocalFile(JNIEnv* env, jobject aFile, nsILocalFile** aLocalFile) "()Ljava/lang/String;"); if (pathMID) { pathName = (jstring) env->CallObjectMethod(aFile, pathMID); + if (pathName != nsnull && !env->ExceptionCheck()) + rv = NS_OK; } } - if (pathName) { + if (NS_SUCCEEDED(rv)) { nsAString* path = jstring_to_nsAString(env, pathName); - nsresult rv = NS_NewLocalFile(*path, false, aLocalFile); - delete path; - return rv; + if (!path) + rv = NS_ERROR_OUT_OF_MEMORY; + + if (NS_SUCCEEDED(rv)) { + rv = NS_NewLocalFile(*path, false, aLocalFile); + delete path; + } } - return NS_ERROR_FAILURE; + return rv; } diff --git a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h index 32544c0c66f..d899779de60 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h +++ b/mozilla/extensions/java/xpcom/nsJavaXPCOMBindingUtils.h @@ -80,6 +80,7 @@ void FreeJavaGlobals(JNIEnv* env); /************************* * JavaXPCOMInstance *************************/ + class JavaXPCOMInstance { public: @@ -94,8 +95,19 @@ private: nsCOMPtr mIInfo; }; -JavaXPCOMInstance* CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, - const nsIID* aIID); +/** + * Creates a new JavaXPCOMInstance which holds the xpcom object and its + * interface info based on the given IID. + * + * @param aXPCOMObject xpcom object to wrap + * @param aIID interface IID for aXPCOMObject + * @param aResult pointer that will hold new JavaXPCOMInstance + * + * @return NS_ERROR_OUT_OF_MEMORY if out of memory; + * NS_ERROR_FAILURE for any other error condition + */ +nsresult CreateJavaXPCOMInstance(nsISupports* aXPCOMObject, const nsIID* aIID, + JavaXPCOMInstance** aResult); /************************************** @@ -123,7 +135,10 @@ nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo, *******************************/ /** - * Constructs and throws an XPCOMException. + * Constructs and throws an exception. Some error codes (such as + * NS_ERROR_OUT_OF_MEMORY) are handled by the appropriate Java exception/error. + * Otherwise, an instance of XPCOMException is created with the given error + * code and message. * * @param env Java environment pointer * @param aErrorCode The error code returned by an XPCOM/Gecko function. Pass @@ -131,9 +146,12 @@ nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo, * @param aMessage A string that provides details for throwing this * exception. Pass in nsnull for the default * behaviour. + * + * @throws OutOfMemoryError if aErrorCode == NS_ERROR_OUT_OF_MEMORY + * XPCOMException for all other error codes */ -void ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode, - const char* aMessage); +void ThrowException(JNIEnv* env, const nsresult aErrorCode, + const char* aMessage); /** * Helper functions for converting from java.lang.String to @@ -142,7 +160,8 @@ void ThrowXPCOMException(JNIEnv* env, const nsresult aErrorCode, * @param env Java environment pointer * @param aString Java string to convert * - * @return nsAString/nsACString with same content as given Java string + * @return nsAString/nsACString with same content as given Java string; or + * nsnull if out of memory */ nsAString* jstring_to_nsAString(JNIEnv* env, jstring aString); nsACString* jstring_to_nsACString(JNIEnv* env, jstring aString); diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp index d0d5d7207d7..a22767b2f6e 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStub.cpp @@ -54,22 +54,28 @@ nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject, mJavaObject = aJavaEnv->NewGlobalRef(aJavaObject); #ifdef DEBUG - jboolean isCopy; + jboolean isCopy = PR_FALSE; + jstring name; + const char* javaObjectName = nsnull; + jclass clazz = mJavaEnv->GetObjectClass(mJavaObject); + if (clazz) { + name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID); + javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy); + } + nsID* iid = nsnull; char* iid_str = nsnull; - jclass clazz = mJavaEnv->GetObjectClass(mJavaObject); - jstring name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID); - const char* javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy); if (mIInfo) { - mIInfo->GetInterfaceIID(&iid); - if (iid) { + nsresult rv = mIInfo->GetInterfaceIID(&iid); + if (NS_SUCCEEDED(rv)) { iid_str = iid->ToString(); nsMemory::Free(iid); } } + LOG(("+++ nsJavaXPTCStub(this=0x%08x java_obj=0x%08x %s iid=%s)\n", (int) this, - mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), javaObjectName, - iid_str ? iid_str : "NULL")); + mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), + javaObjectName ? javaObjectName : "<-->", iid_str ? iid_str : "NULL")); if (isCopy) mJavaEnv->ReleaseStringUTFChars(name, javaObjectName); if (iid_str) @@ -80,12 +86,18 @@ nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject, nsJavaXPTCStub::~nsJavaXPTCStub() { #ifdef DEBUG - jboolean isCopy; + jboolean isCopy = PR_FALSE; + jstring name; + const char* javaObjectName = nsnull; jclass clazz = mJavaEnv->GetObjectClass(mJavaObject); - jstring name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID); - const char* javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy); + if (clazz) { + name = (jstring) mJavaEnv->CallObjectMethod(clazz, getNameMID); + javaObjectName = mJavaEnv->GetStringUTFChars(name, &isCopy); + } + LOG(("--- ~nsJavaXPTCStub(this=0x%08x java_obj=0x%08x %s)\n", (int) this, - mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), javaObjectName)); + mJavaEnv->CallIntMethod(mJavaObject, hashCodeMID), + javaObjectName ? javaObjectName : "<-->")); if (isCopy) mJavaEnv->ReleaseStringUTFChars(name, javaObjectName); #endif @@ -140,6 +152,7 @@ NS_IMETHODIMP nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr) { LOG(("JavaStub::QueryInterface()\n")); + *aInstancePtr = nsnull; nsJavaXPTCStub *master = mMaster ? mMaster : this; // This helps us differentiate between the help classes. @@ -178,55 +191,75 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr) // Query Java object LOG(("\tCalling Java object queryInterface\n")); + jmethodID qiMID = 0; jclass clazz = mJavaEnv->GetObjectClass(mJavaObject); - char* sig = "(Ljava/lang/String;)Lorg/mozilla/xpcom/nsISupports;"; - jmethodID qiMID = mJavaEnv->GetMethodID(clazz, "queryInterface", sig); - NS_ASSERTION(qiMID, "Failed to get queryInterface method ID"); - - char* iid_str = aIID.ToString(); - jstring iid_jstr = mJavaEnv->NewStringUTF(iid_str); - PR_Free(iid_str); - jobject obj = mJavaEnv->CallObjectMethod(mJavaObject, qiMID, iid_jstr); - - if (obj) { - // Get interface info for new java object - nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); - nsCOMPtr iinfo; - iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); - - nsJavaXPTCStub* stub = new nsJavaXPTCStub(mJavaEnv, obj, iinfo); - - // add stub to the master's list of children, so we can preserve - // symmetry in future QI calls. the master will delete each child - // when it is destroyed. the refcount of each child is bound to - // the refcount of the master. this is done to deal with code - // like this: - // - // nsCOMPtr bar = ...; - // nsIFoo *foo; - // { - // nsCOMPtr temp = do_QueryInterface(bar); - // foo = temp; - // } - // foo->DoStuff(); - // - // while this code is not valid XPCOM (since it is using |foo| - // after having called Release on it), such code is unfortunately - // very common in the mozilla codebase. the assumption this code - // is making is that so long as |bar| is alive, it should be valid - // to access |foo| even if the code doesn't own a strong reference - // to |foo|! clearly wrong, but we need to support it anyways. - - stub->mMaster = master; - master->mChildren.AppendElement(stub); - - *aInstancePtr = stub; - NS_ADDREF(stub); - return NS_OK; + if (clazz) { + char* sig = "(Ljava/lang/String;)Lorg/mozilla/xpcom/nsISupports;"; + qiMID = mJavaEnv->GetMethodID(clazz, "queryInterface", sig); + NS_ASSERTION(qiMID, "Failed to get queryInterface method ID"); } - *aInstancePtr = nsnull; - return NS_NOINTERFACE; + if (qiMID == nsnull) { + mJavaEnv->ExceptionClear(); + return NS_NOINTERFACE; + } + + // construct IID string + char* iid_str = aIID.ToString(); + jstring iid_jstr = mJavaEnv->NewStringUTF(iid_str); + if (!iid_str || !iid_jstr) { + mJavaEnv->ExceptionClear(); + return NS_ERROR_OUT_OF_MEMORY; + } + PR_Free(iid_str); + + // call queryInterface method + jobject obj = mJavaEnv->CallObjectMethod(mJavaObject, qiMID, iid_jstr); + if (mJavaEnv->ExceptionCheck()) { + mJavaEnv->ExceptionClear(); + return NS_ERROR_FAILURE; + } + if (!obj) + return NS_NOINTERFACE; + + // Get interface info for new java object + nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); + nsCOMPtr iinfo; + nsresult rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); + if (NS_FAILED(rv)) + return rv; + + stub = new nsJavaXPTCStub(mJavaEnv, obj, iinfo); + if (!stub) + return NS_ERROR_OUT_OF_MEMORY; + + // add stub to the master's list of children, so we can preserve + // symmetry in future QI calls. the master will delete each child + // when it is destroyed. the refcount of each child is bound to + // the refcount of the master. this is done to deal with code + // like this: + // + // nsCOMPtr bar = ...; + // nsIFoo *foo; + // { + // nsCOMPtr temp = do_QueryInterface(bar); + // foo = temp; + // } + // foo->DoStuff(); + // + // while this code is not valid XPCOM (since it is using |foo| + // after having called Release on it), such code is unfortunately + // very common in the mozilla codebase. the assumption this code + // is making is that so long as |bar| is alive, it should be valid + // to access |foo| even if the code doesn't own a strong reference + // to |foo|! clearly wrong, but we need to support it anyways. + + stub->mMaster = master; + master->mChildren.AppendElement(stub); + + *aInstancePtr = stub; + NS_ADDREF(stub); + return NS_OK; } PRBool @@ -293,6 +326,8 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex, const nsXPTParamInfo* retvalInfo = nsnull; if (paramCount) { java_params = new jvalue[paramCount]; + if (!java_params) + return NS_ERROR_OUT_OF_MEMORY; for (PRUint8 i = 0; i < paramCount && NS_SUCCEEDED(rv); i++) { @@ -341,11 +376,13 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex, if (clazz) mid = mJavaEnv->GetMethodID(clazz, methodName.get(), methodSig.get()); NS_ASSERTION(mid, "Failed to get requested method for Java object"); + if (!mid) + rv = NS_ERROR_FAILURE; } // Call method jvalue retval; - if (mid) { + if (NS_SUCCEEDED(rv)) { if (!retvalInfo) { mJavaEnv->CallVoidMethodA(mJavaObject, mid, java_params); } else { @@ -415,12 +452,27 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex, } // Check for exception from called Java function - if (mJavaEnv->ExceptionCheck()) { + jthrowable exp = mJavaEnv->ExceptionOccurred(); + if (exp) { #ifdef DEBUG mJavaEnv->ExceptionDescribe(); #endif - mJavaEnv->ExceptionClear(); - rv = NS_ERROR_FAILURE; + + // If the exception is an instance of XPCOMException, then get the + // nsresult from the exception instance. Else, default to + // NS_ERROR_FAILURE. + if (mJavaEnv->IsInstanceOf(exp, xpcomExceptionClass)) { + jfieldID fid; + fid = mJavaEnv->GetFieldID(xpcomExceptionClass, "errorcode", "J"); + if (fid) { + rv = mJavaEnv->GetLongField(exp, fid); + } else { + rv = NS_ERROR_FAILURE; + } + NS_ASSERTION(fid, "Couldn't get 'errorcode' field of XPCOMException"); + } else { + rv = NS_ERROR_FAILURE; + } } } @@ -443,6 +495,7 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex, if (java_params) delete [] java_params; + mJavaEnv->ExceptionClear(); return rv; } @@ -454,7 +507,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, nsXPTCMiniVariant &aVariant, jvalue &aJValue, nsACString &aMethodSig) { - nsresult rv; + nsresult rv = NS_OK; const nsXPTType &type = aParamInfo.GetType(); PRUint8 tag = type.TagPart(); switch (tag) @@ -467,6 +520,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('B'); } else { jbyteArray array = mJavaEnv->NewByteArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetByteArrayRegion(array, 0, 1, (jbyte*) &(aVariant.val.u8)); aJValue.l = array; aMethodSig.AppendLiteral("[B"); @@ -482,6 +539,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('S'); } else { jshortArray array = mJavaEnv->NewShortArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetShortArrayRegion(array, 0, 1, (jshort*) &(aVariant.val.u16)); aJValue.l = array; @@ -498,6 +559,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('I'); } else { jintArray array = mJavaEnv->NewIntArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) &(aVariant.val.u32)); aJValue.l = array; aMethodSig.AppendLiteral("[I"); @@ -513,6 +578,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('J'); } else { jlongArray array = mJavaEnv->NewLongArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetLongArrayRegion(array, 0, 1, (jlong*) &(aVariant.val.u64)); aJValue.l = array; aMethodSig.AppendLiteral("[J"); @@ -527,6 +596,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('F'); } else { jfloatArray array = mJavaEnv->NewFloatArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetFloatArrayRegion(array, 0, 1, (jfloat*) &(aVariant.val.f)); aJValue.l = array; aMethodSig.AppendLiteral("[F"); @@ -541,6 +614,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('D'); } else { jdoubleArray array = mJavaEnv->NewDoubleArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetDoubleArrayRegion(array, 0, 1, (jdouble*) &(aVariant.val.d)); aJValue.l = array; @@ -556,6 +633,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('Z'); } else { jbooleanArray array = mJavaEnv->NewBooleanArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetBooleanArrayRegion(array, 0, 1, (jboolean*) &(aVariant.val.b)); aJValue.l = array; @@ -572,6 +653,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('C'); } else { jcharArray array = mJavaEnv->NewCharArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetCharArrayRegion(array, 0, 1, (jchar*) &(aVariant.val.wc)); aJValue.l = array; aMethodSig.AppendLiteral("[C"); @@ -590,7 +675,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, ptr = *variant; } - jobject str = nsnull; + jobject str; if (ptr) { if (tag == nsXPTType::T_CHAR_STR) { str = mJavaEnv->NewStringUTF((const char*) ptr); @@ -598,16 +683,23 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, const PRUnichar* buf = (const PRUnichar*) ptr; str = mJavaEnv->NewString(buf, nsCRT::strlen(buf)); } - } - if (str == nsnull) { + } else { str = mJavaEnv->NewStringUTF((const char*)""); } + if (!str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (!aParamInfo.IsOut()) { aJValue.l = str; aMethodSig.AppendLiteral("Ljava/lang/String;"); } else { aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str); + if (aJValue.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aMethodSig.AppendLiteral("[Ljava/lang/String;"); } } @@ -620,6 +712,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, if (iid) { char* iid_str = iid->ToString(); str = mJavaEnv->NewStringUTF(iid_str); + if (!iid_str || !str) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } PR_Free(iid_str); } @@ -628,6 +724,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.AppendLiteral("Ljava/lang/String;"); } else { aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str); + if (aJValue.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aMethodSig.AppendLiteral("[Ljava/lang/String;"); } } @@ -648,20 +748,23 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodIndex, aDispatchParams, PR_FALSE, iid); if (NS_FAILED(rv)) - return rv; + break; - inst = CreateJavaXPCOMInstance((nsISupports*) aVariant.val.p, &iid); + rv = CreateJavaXPCOMInstance((nsISupports*) aVariant.val.p, &iid, + &inst); + if (NS_FAILED(rv)) + break; - if (inst) { - // create java stub - char* iface_name; - inst->InterfaceInfo()->GetName(&iface_name); - java_stub = CreateJavaWrapper(mJavaEnv, iface_name); + // create java stub + char* iface_name; + rv = inst->InterfaceInfo()->GetName(&iface_name); + if (NS_FAILED(rv)) + break; + java_stub = CreateJavaWrapper(mJavaEnv, iface_name); - if (java_stub) { - // Associate XPCOM object w/ Java stub - AddJavaXPCOMBinding(mJavaEnv, java_stub, inst); - } + if (java_stub) { + // Associate XPCOM object w/ Java stub + AddJavaXPCOMBinding(mJavaEnv, java_stub, inst); } } } @@ -671,6 +774,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.AppendLiteral("Lorg/mozilla/xpcom/nsISupports;"); } else { aJValue.l = mJavaEnv->NewObjectArray(1, nsISupportsClass, java_stub); + if (aJValue.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aMethodSig.AppendLiteral("[Lorg/mozilla/xpcom/nsISupports;"); } } @@ -683,6 +790,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, nsString* str = (nsString*) aVariant.val.p; if (str) { jstr = mJavaEnv->NewString(str->get(), str->Length()); + if (!jstr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } if (!aParamInfo.IsOut()) { @@ -690,6 +801,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.AppendLiteral("Ljava/lang/String;"); } else { aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr); + if (aJValue.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aMethodSig.AppendLiteral("[Ljava/lang/String;"); } } @@ -702,6 +817,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, nsCString* str = (nsCString*) aVariant.val.p; if (str) { jstr = mJavaEnv->NewStringUTF(str->get()); + if (!jstr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } } if (!aParamInfo.IsOut()) { @@ -709,6 +828,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.AppendLiteral("Ljava/lang/String;"); } else { aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr); + if (aJValue.l == nsnull) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aMethodSig.AppendLiteral("[Ljava/lang/String;"); } } @@ -722,6 +845,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, aMethodSig.Append('I'); } else { jintArray array = mJavaEnv->NewIntArray(1); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) &(aVariant.val.p)); aJValue.l = array; aMethodSig.AppendLiteral("[I"); @@ -741,7 +868,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo, return NS_ERROR_UNEXPECTED; } - return NS_OK; + return rv; } nsresult @@ -830,7 +957,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, nsXPTCMiniVariant* aDispatchParams, nsXPTCMiniVariant &aVariant, jvalue &aJValue) { - nsresult rv; + nsresult rv = NS_OK; const nsXPTType &type = aParamInfo.GetType(); switch (type.TagPart()) @@ -846,6 +973,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean isCopy = PR_FALSE; jbyte* array = mJavaEnv->GetByteArrayElements((jbyteArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRUint8 *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseByteArrayElements((jbyteArray) aJValue.l, array, @@ -869,6 +1000,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jshort* array = mJavaEnv->GetShortArrayElements((jshortArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRUint16 *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseShortArrayElements((jshortArray) aJValue.l, array, @@ -891,6 +1026,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean isCopy = PR_FALSE; jint* array = mJavaEnv->GetIntArrayElements((jintArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRUint32 *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseIntArrayElements((jintArray) aJValue.l, array, @@ -913,6 +1052,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean isCopy = PR_FALSE; jlong* array = mJavaEnv->GetLongArrayElements((jlongArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRUint64 *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseLongArrayElements((jlongArray) aJValue.l, array, @@ -935,6 +1078,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jfloat* array = mJavaEnv->GetFloatArrayElements((jfloatArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((float *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseFloatArrayElements((jfloatArray) aJValue.l, array, @@ -957,6 +1104,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jdouble* array = mJavaEnv->GetDoubleArrayElements((jdoubleArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((double *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseDoubleArrayElements((jdoubleArray) aJValue.l, @@ -979,6 +1130,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean* array = mJavaEnv->GetBooleanArrayElements((jbooleanArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRBool *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseBooleanArrayElements((jbooleanArray) aJValue.l, @@ -1004,6 +1159,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean isCopy = PR_FALSE; jchar* array = mJavaEnv->GetCharArrayElements((jcharArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (type.TagPart() == nsXPTType::T_CHAR) *((char *) aVariant.val.p) = array[0]; else @@ -1026,12 +1185,16 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, str = (jstring) aJValue.l; } else if (aParamInfo.IsOut()) { str = (jstring) - mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0); + mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0); } if (str) { jboolean isCopy; const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy); + if (!char_ptr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((char **) aVariant.val.p) = strdup(char_ptr); if (isCopy) { mJavaEnv->ReleaseStringUTFChars(str, char_ptr); @@ -1057,10 +1220,18 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (str) { jboolean isCopy; const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, &isCopy); + if (!wchar_ptr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } PRUint32 length = nsCRT::strlen(wchar_ptr); PRUnichar* string = (PRUnichar*) nsMemory::Alloc((length + 1) * sizeof(PRUnichar)); + if (!string) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } memcpy(string, wchar_ptr, length * sizeof(PRUnichar)); string[length] = 0; *((PRUnichar **) aVariant.val.p) = string; @@ -1089,6 +1260,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (str) { jboolean isCopy; const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy); + if (!char_ptr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (aVariant.val.p) { // If not null, then we just put in the new value. @@ -1133,7 +1308,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, aMethodIndex, aDispatchParams, PR_FALSE, iid); if (NS_FAILED(rv)) - return rv; + break; PRBool isWeakRef = iid.Equals(NS_GET_IID(nsIWeakReference)); @@ -1141,11 +1316,17 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, // Get interface info for class nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); nsCOMPtr iinfo; - iim->GetInfoForIID(&iid, getter_AddRefs(iinfo)); + rv = iim->GetInfoForIID(&iid, getter_AddRefs(iinfo)); + if (NS_FAILED(rv)) + break; // Create XPCOM stub - nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(mJavaEnv, java_obj, - iinfo); + nsJavaXPTCStub* xpcomStub; + xpcomStub = new nsJavaXPTCStub(mJavaEnv, java_obj, iinfo); + if (!xpcomStub) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } inst = SetAsXPTCStub(xpcomStub); AddJavaXPCOMBinding(mJavaEnv, java_obj, inst); } @@ -1153,8 +1334,12 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (isWeakRef) { // If the function expects an weak reference, then we need to // create it here. - nsJavaXPTCStubWeakRef* weakref = - new nsJavaXPTCStubWeakRef(mJavaEnv, java_obj); + nsJavaXPTCStubWeakRef* weakref; + weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, java_obj); + if (!weakref) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } NS_ADDREF(weakref); *((void **) aVariant.val.p) = (void*) weakref; } else if (IsXPTCStub(inst)) { @@ -1187,11 +1372,19 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (str) { jboolean isCopy; const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, &isCopy); + if (!wchar_ptr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (aVariant.val.p) { ((nsString*) aVariant.val.p)->Assign(wchar_ptr); } else { nsString* embedStr = new nsString(wchar_ptr); + if (!embedStr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aVariant.val.p = embedStr; } @@ -1218,11 +1411,19 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, if (str) { jboolean isCopy; const char* char_ptr = mJavaEnv->GetStringUTFChars(str, &isCopy); + if (!char_ptr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } if (aVariant.val.p) { ((nsCString*) aVariant.val.p)->Assign(char_ptr); } else { nsCString* embedStr = new nsCString(char_ptr); + if (!embedStr) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } aVariant.val.p = embedStr; } @@ -1244,6 +1445,10 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, jboolean isCopy = PR_FALSE; jint* array = mJavaEnv->GetIntArrayElements((jintArray) aJValue.l, &isCopy); + if (!array) { + rv = NS_ERROR_OUT_OF_MEMORY; + break; + } *((PRUint32 *) aVariant.val.p) = array[0]; if (isCopy) { mJavaEnv->ReleaseIntArrayElements((jintArray) aJValue.l, array, @@ -1260,7 +1465,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo, return NS_ERROR_UNEXPECTED; } - return NS_OK; + return rv; } NS_IMETHODIMP @@ -1274,8 +1479,11 @@ nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr) if (!aInstancePtr) return NS_ERROR_NULL_POINTER; - nsJavaXPTCStubWeakRef* weakref = - new nsJavaXPTCStubWeakRef(mJavaEnv, mJavaObject); + nsJavaXPTCStubWeakRef* weakref; + weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, mJavaObject); + if (!weakref) + return NS_ERROR_OUT_OF_MEMORY; + *aInstancePtr = weakref; NS_ADDREF(*aInstancePtr); diff --git a/mozilla/extensions/java/xpcom/nsJavaXPTCStubWeakRef.cpp b/mozilla/extensions/java/xpcom/nsJavaXPTCStubWeakRef.cpp index dd700cd6fbd..232e4a431f2 100644 --- a/mozilla/extensions/java/xpcom/nsJavaXPTCStubWeakRef.cpp +++ b/mozilla/extensions/java/xpcom/nsJavaXPTCStubWeakRef.cpp @@ -78,10 +78,14 @@ nsJavaXPTCStubWeakRef::QueryReferent(const nsIID& aIID, void** aInstancePtr) // Get interface info for class nsCOMPtr iim = XPTI_GetInterfaceInfoManager(); nsCOMPtr iinfo; - iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); + nsresult rv = iim->GetInfoForIID(&aIID, getter_AddRefs(iinfo)); + if (NS_FAILED(rv)) + return rv; // Create XPCOM stub nsJavaXPTCStub* xpcomStub = new nsJavaXPTCStub(mJavaEnv, javaObject, iinfo); + if (!xpcomStub) + return NS_ERROR_OUT_OF_MEMORY; NS_ADDREF(xpcomStub); AddJavaXPCOMBinding(mJavaEnv, javaObject, SetAsXPTCStub(xpcomStub));