[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.19-706-ge5415e9

barraclough at apple.com barraclough at apple.com
Thu Feb 4 21:28:19 UTC 2010


The following commit has been merged in the webkit-1.1 branch:
commit 50845780e79a5c2f8bd71889c240f3bf71e74513
Author: barraclough at apple.com <barraclough at apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Tue Jan 26 22:00:38 2010 +0000

    <<<<<<< .mine
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@53865 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 97828fb..1639cee 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+<<<<<<< .mine
+2010-01-25  Gavin Barraclough  <barraclough at apple.com>
+
+        Reviewed by Anders Carlsson.
+
+        Some methods in JSC JNI bridge need more error checking of results from JNI.
+        https://bugs.webkit.org/show_bug.cgi?id=34149
+
+        In JNIUtility.h, callJNIMethodV<jobject> might return null (from CallObjectMethodV, via
+        JNICaller<jobject>::callV) if an exception is thrown.  All clients of callJNIMethodV<jobject>
+        that are calling methods on the returned object should null check first.
+
+        * bridge/jni/JNIBridge.cpp:
+        (JavaField::JavaField):
+        (JavaMethod::JavaMethod):
+        * bridge/jni/JNIUtility.h:
+        (JSC::Bindings::):
+        * bridge/jni/jni_jsobject.mm:
+        (JavaJSObject::convertJObjectToValue):
+        * bridge/jni/jsc/JavaClassJSC.cpp:
+        (JavaClass::JavaClass):
+        * bridge/jni/jsc/JavaInstanceJSC.cpp:
+        (JavaInstance::stringValue):
+
+=======
 2010-01-26  Steve Falkenburg  <sfalken at apple.com>
 
         Reviewed by Oliver Hunt.
@@ -340,6 +365,7 @@
         (WebCore::XMLTokenizer::XMLTokenizer):
         (WebCore::parseXMLDocumentFragment):
 
+>>>>>>> .r53864
 2010-01-22  Jeremy Orlow  <jorlow at chromium.org>
 
         Reviewed by Darin Adler.
diff --git a/WebCore/bridge/jni/JNIBridge.cpp b/WebCore/bridge/jni/JNIBridge.cpp
index 4810e5f..3329ba8 100644
--- a/WebCore/bridge/jni/JNIBridge.cpp
+++ b/WebCore/bridge/jni/JNIBridge.cpp
@@ -55,32 +55,44 @@ JavaParameter::JavaParameter(JNIEnv* env, jstring type)
 
 JavaMethod::JavaMethod(JNIEnv* env, jobject aMethod)
 {
-    // Get return type
-    jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;");
-    jstring returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
+    // Get return type name
+    jstring returnTypeName = 0;
+    if (jobject returnType = callJNIMethod<jobject>(aMethod, "getReturnType", "()Ljava/lang/Class;")) {
+            returnTypeName = static_cast<jstring>(callJNIMethod<jobject>(returnType, "getName", "()Ljava/lang/String;"));
+        if (!returnTypeName)
+            returnTypeName = env->NewStringUTF("<Unknown>");
+        env->DeleteLocalRef(returnType);
+    }
     m_returnType = JavaString(env, returnTypeName);
     m_JNIReturnType = JNITypeFromClassName(m_returnType.UTF8String());
-    env->DeleteLocalRef(returnType);
     env->DeleteLocalRef(returnTypeName);
 
     // Get method name
     jstring methodName = static_cast<jstring>(callJNIMethod<jobject>(aMethod, "getName", "()Ljava/lang/String;"));
+    if (!returnTypeName)
+        returnTypeName = env->NewStringUTF("<Unknown>");
     m_name = JavaString(env, methodName);
     env->DeleteLocalRef(methodName);
 
     // Get parameters
-    jarray jparameters = static_cast<jarray>(callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;"));
-    m_numParameters = env->GetArrayLength(jparameters);
-    m_parameters = new JavaParameter[m_numParameters];
-
-    for (int i = 0; i < m_numParameters; i++) {
-        jobject aParameter = env->GetObjectArrayElement(static_cast<jobjectArray>(jparameters), i);
-        jstring parameterName = static_cast<jstring>(callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;"));
-        m_parameters[i] = JavaParameter(env, parameterName);
-        env->DeleteLocalRef(aParameter);
-        env->DeleteLocalRef(parameterName);
+    if (jarray jparameters = static_cast<jarray>(callJNIMethod<jobject>(aMethod, "getParameterTypes", "()[Ljava/lang/Class;"))) {
+        m_numParameters = env->GetArrayLength(jparameters);
+        m_parameters = new JavaParameter[m_numParameters];
+
+        for (int i = 0; i < m_numParameters; i++) {
+            jobject aParameter = env->GetObjectArrayElement(static_cast<jobjectArray>(jparameters), i);
+            jstring parameterName = static_cast<jstring>(callJNIMethod<jobject>(aParameter, "getName", "()Ljava/lang/String;"));
+            if (!parameterName)
+                parameterName = env->NewStringUTF("<Unknown>");
+            m_parameters[i] = JavaParameter(env, parameterName);
+            env->DeleteLocalRef(aParameter);
+            env->DeleteLocalRef(parameterName);
+        }
+        env->DeleteLocalRef(jparameters);
+    } else {
+        m_numParameters = 0;
+        m_parameters = 0;
     }
-    env->DeleteLocalRef(jparameters);
 
     // Created lazily.
     m_signature = 0;
diff --git a/WebCore/bridge/jni/JNIUtility.h b/WebCore/bridge/jni/JNIUtility.h
index 85c3533..c832ef3 100644
--- a/WebCore/bridge/jni/JNIUtility.h
+++ b/WebCore/bridge/jni/JNIUtility.h
@@ -81,11 +81,11 @@ template <typename T> struct JNICaller;
 template<> struct JNICaller<void> {
     static void callA(jobject obj, jmethodID mid, jvalue* args)
     {
-        return getJNIEnv()->CallVoidMethodA(obj, mid, args);
+        getJNIEnv()->CallVoidMethodA(obj, mid, args);
     }
     static void callV(jobject obj, jmethodID mid, va_list args)
     {
-        return getJNIEnv()->CallVoidMethodV(obj, mid, args);
+        getJNIEnv()->CallVoidMethodV(obj, mid, args);
     }
 };
 
diff --git a/WebCore/bridge/jni/jni_jsobject.mm b/WebCore/bridge/jni/jni_jsobject.mm
index de67711..603624f 100644
--- a/WebCore/bridge/jni/jni_jsobject.mm
+++ b/WebCore/bridge/jni/jni_jsobject.mm
@@ -128,7 +128,7 @@ static void dispatchToJavaScriptThread(JSObjectCallContext *context)
     completionSource = CFRunLoopSourceCreate(NULL, 0, &sourceContext);
     CFRunLoopAddSource(currentRunLoop, completionSource, kCFRunLoopDefaultMode);
     
-    // Wakeup JavaScript access thread and make it do it's work.
+    // Wakeup JavaScript access thread and make it do its work.
     CFRunLoopSourceSignal(_performJavaScriptSource);
     if (CFRunLoopIsWaiting(_performJavaScriptRunLoop))
         CFRunLoopWakeUp(_performJavaScriptRunLoop);
@@ -533,7 +533,7 @@ jobject JavaJSObject::convertValueToJObject(JSValue value) const
             // We either have a wrapper around a Java instance or a JavaScript
             // object.  If we have a wrapper around a Java instance, return that
             // instance, otherwise create a new Java JavaJSObject with the JSObject*
-            // as it's nativeHandle.
+            // as its nativeHandle.
             if (imp->classInfo() && strcmp(imp->classInfo()->className, "RuntimeObject") == 0) {
                 RuntimeObjectImp* runtimeImp = static_cast<RuntimeObjectImp*>(imp);
                 JavaInstance *runtimeInstance = static_cast<JavaInstance *>(runtimeImp->getInternalInstance());
@@ -552,7 +552,7 @@ jobject JavaJSObject::convertValueToJObject(JSValue value) const
             nativeHandle = UndefinedHandle;
         }
         
-        // Now create the Java JavaJSObject.  Look for the JavaJSObject in it's new (Tiger)
+        // Now create the Java JavaJSObject.  Look for the JavaJSObject in its new (Tiger)
         // location and in the original Java 1.4.2 location.
         jclass JSObjectClass;
         
@@ -580,30 +580,31 @@ JSValue JavaJSObject::convertJObjectToValue(ExecState* exec, jobject theObject)
     // See section 22.7 of 'JavaScript:  The Definitive Guide, 4th Edition',
     // figure 22-4.
     jobject classOfInstance = callJNIMethod<jobject>(theObject, "getClass", "()Ljava/lang/Class;");
-    jstring className = (jstring)callJNIMethod<jobject>(classOfInstance, "getName", "()Ljava/lang/String;");
-    
+    if (!classOfInstance) {
+        JSLock lock(SilenceAssertionsOnly);
+        return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
+    }
+
     // Only the sun.plugin.javascript.webkit.JSObject has a member called nativeJSObject. This class is
     // created above to wrap internal browser objects. The constructor of this class takes the native
     // pointer and stores it in this object, so that it can be retrieved below.
-    if (strcmp(JavaString(className).UTF8String(), "sun.plugin.javascript.webkit.JSObject") == 0) {
-        // Pull the nativeJSObject value from the Java instance.  This is a
-        // pointer to the JSObject.
-        JNIEnv *env = getJNIEnv();
-        jfieldID fieldID = env->GetFieldID((jclass)classOfInstance, "nativeJSObject", "J");
-        if (fieldID == NULL) {
-            return jsUndefined();
-        }
-        jlong nativeHandle = env->GetLongField(theObject, fieldID);
-        if (nativeHandle == UndefinedHandle) {
-            return jsUndefined();
-        }
-        JSObject *imp = static_cast<JSObject*>(jlong_to_impptr(nativeHandle));
-        return imp;
+    jstring className = (jstring)callJNIMethod<jobject>(classOfInstance, "getName", "()Ljava/lang/String;");
+    if (!className || (strcmp(JavaString(className).UTF8String(), "sun.plugin.javascript.webkit.JSObject") != 0)) {
+        JSLock lock(SilenceAssertionsOnly);
+        return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
     }
 
-    JSLock lock(SilenceAssertionsOnly);
-
-    return JavaInstance::create(theObject, _rootObject)->createRuntimeObject(exec);
+    // Pull the nativeJSObject value from the Java instance.  This is a
+    // pointer to the JSObject.
+    JNIEnv *env = getJNIEnv();
+    jfieldID fieldID = env->GetFieldID((jclass)classOfInstance, "nativeJSObject", "J");
+    if (fieldID == NULL)
+        return jsUndefined();
+    jlong nativeHandle = env->GetLongField(theObject, fieldID);
+    if (nativeHandle == UndefinedHandle)
+        return jsUndefined();
+    JSObject *imp = static_cast<JSObject*>(jlong_to_impptr(nativeHandle));
+    return imp;
 }
 
 void JavaJSObject::getListFromJArray(ExecState* exec, jobjectArray jArray, MarkedArgumentBuffer& list) const
diff --git a/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp b/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
index 4bc6c47..4e1b0d2 100644
--- a/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JNIBridgeJSC.cpp
@@ -49,14 +49,20 @@ using namespace JSC::Bindings;
 
 JavaField::JavaField(JNIEnv* env, jobject aField)
 {
-    // Get field type
-    jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;");
-    jstring fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+    // Get field type name
+    jstring fieldTypeName = 0;
+    if (jobject fieldType = callJNIMethod<jobject>(aField, "getType", "()Ljava/lang/Class;"))
+        fieldTypeName = static_cast<jstring>(callJNIMethod<jobject>(fieldType, "getName", "()Ljava/lang/String;"));
+    if (!fieldTypeName)
+        fieldTypeName = env->NewStringUTF("<Unknown>");
     m_type = JavaString(env, fieldTypeName);
+
     m_JNIType = JNITypeFromClassName(m_type.UTF8String());
 
     // Get field name
     jstring fieldName = static_cast<jstring>(callJNIMethod<jobject>(aField, "getName", "()Ljava/lang/String;"));
+    if (!fieldName)
+        fieldName = env->NewStringUTF("<Unknown>");
     m_name = JavaString(env, fieldName);
 
     m_field = new JObjectWrapper(aField);
diff --git a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
index 350c8ae..bbe3871 100644
--- a/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaClassJSC.cpp
@@ -41,52 +41,57 @@ JavaClass::JavaClass(jobject anInstance)
 
     if (!aClass) {
         fprintf(stderr, "%s:  unable to call getClass on instance %p\n", __PRETTY_FUNCTION__, anInstance);
+        m_name = strdup("<Unknown>");
         return;
     }
 
-    jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;");
-    const char* classNameC = getCharactersFromJString(className);
-    m_name = strdup(classNameC);
-    releaseCharactersForJString(className, classNameC);
+    if (jstring className = (jstring)callJNIMethod<jobject>(aClass, "getName", "()Ljava/lang/String;")) {
+        const char* classNameC = getCharactersFromJString(className);
+        m_name = strdup(classNameC);
+        releaseCharactersForJString(className, classNameC);
+    } else
+        m_name = strdup("<Unknown>");
 
     int i;
     JNIEnv* env = getJNIEnv();
 
     // Get the fields
-    jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;");
-    int numFields = env->GetArrayLength(fields);
-    for (i = 0; i < numFields; i++) {
-        jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
-        JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
-        {
-            JSLock lock(SilenceAssertionsOnly);
-            m_fields.set(((UString)aField->name()).rep(), aField);
+    if (jarray fields = (jarray)callJNIMethod<jobject>(aClass, "getFields", "()[Ljava/lang/reflect/Field;")) {
+        int numFields = env->GetArrayLength(fields);
+        for (i = 0; i < numFields; i++) {
+            jobject aJField = env->GetObjectArrayElement((jobjectArray)fields, i);
+            JavaField* aField = new JavaField(env, aJField); // deleted in the JavaClass destructor
+            {
+                JSLock lock(SilenceAssertionsOnly);
+                m_fields.set(((UString)aField->name()).rep(), aField);
+            }
+            env->DeleteLocalRef(aJField);
         }
-        env->DeleteLocalRef(aJField);
+        env->DeleteLocalRef(fields);
     }
 
     // Get the methods
-    jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;");
-    int numMethods = env->GetArrayLength(methods);
-    for (i = 0; i < numMethods; i++) {
-        jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
-        JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
-        MethodList* methodList;
-        {
-            JSLock lock(SilenceAssertionsOnly);
-
-            methodList = m_methods.get(((UString)aMethod->name()).rep());
-            if (!methodList) {
-                methodList = new MethodList();
-                m_methods.set(((UString)aMethod->name()).rep(), methodList);
+    if (jarray methods = (jarray)callJNIMethod<jobject>(aClass, "getMethods", "()[Ljava/lang/reflect/Method;")) {
+        int numMethods = env->GetArrayLength(methods);
+        for (i = 0; i < numMethods; i++) {
+            jobject aJMethod = env->GetObjectArrayElement((jobjectArray)methods, i);
+            JavaMethod* aMethod = new JavaMethod(env, aJMethod); // deleted in the JavaClass destructor
+            MethodList* methodList;
+            {
+                JSLock lock(SilenceAssertionsOnly);
+
+                methodList = m_methods.get(((UString)aMethod->name()).rep());
+                if (!methodList) {
+                    methodList = new MethodList();
+                    m_methods.set(((UString)aMethod->name()).rep(), methodList);
+                }
             }
+            methodList->append(aMethod);
+            env->DeleteLocalRef(aJMethod);
         }
-        methodList->append(aMethod);
-        env->DeleteLocalRef(aJMethod);
+        env->DeleteLocalRef(methods);
     }
 
-    env->DeleteLocalRef(fields);
-    env->DeleteLocalRef(methods);
     env->DeleteLocalRef(aClass);
 }
 
diff --git a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
index aab0d5c..aaa79b8 100644
--- a/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
+++ b/WebCore/bridge/jni/jsc/JavaInstanceJSC.cpp
@@ -90,6 +90,11 @@ JSValue JavaInstance::stringValue(ExecState* exec) const
     JSLock lock(SilenceAssertionsOnly);
 
     jstring stringValue = (jstring)callJNIMethod<jobject>(m_instance->m_instance, "toString", "()Ljava/lang/String;");
+
+    // Should throw a JS exception, rather than returning ""? - but better than a null dereference.
+    if (!stringValue)
+        return jsString(exec, UString());
+
     JNIEnv* env = getJNIEnv();
     const jchar* c = getUCharactersFromJStringInEnv(env, stringValue);
     UString u((const UChar*)c, (int)env->GetStringLength(stringValue));

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list