[icedtea-web/f15] - Resolves: rhbz#791242 - Added patch to fix crashes with Firefox 10+

Deepak Bhole dbhole at fedoraproject.org
Mon Mar 5 22:38:11 UTC 2012


commit 0487cf124a2a45e802f340b517ad4b8fcf4ee643
Author: Deepak Bhole <dbhole at redhat.com>
Date:   Mon Mar 5 17:21:32 2012 -0500

    - Resolves: rhbz#791242
    - Added patch to fix crashes with Firefox 10+

 icedtea-web-rh791242.patch |  340 ++++++++++++++++++++++++++++++++++++++++++++
 icedtea-web.spec           |    8 +-
 2 files changed, 347 insertions(+), 1 deletions(-)
---
diff --git a/icedtea-web-rh791242.patch b/icedtea-web-rh791242.patch
new file mode 100644
index 0000000..7f71cb3
--- /dev/null
+++ b/icedtea-web-rh791242.patch
@@ -0,0 +1,340 @@
+diff -up ./plugin/icedteanp/IcedTeaJavaRequestProcessor.cc.sav ./plugin/icedteanp/IcedTeaJavaRequestProcessor.cc
+--- ./plugin/icedteanp/IcedTeaJavaRequestProcessor.cc.sav	2011-08-04 15:08:13.000000000 -0400
++++ ./plugin/icedteanp/IcedTeaJavaRequestProcessor.cc	2012-03-05 17:13:47.000000000 -0500
+@@ -921,6 +921,7 @@ createJavaObjectFromVariant(NPP instance
+         {
+             PLUGIN_DEBUG("NPObject is not a Java object\n");
+             NPIdentifier length_id = browser_functions.getstringidentifier("length");
++            bool isJSObjectArray = false;
+ 
+             // FIXME: We currently only handle <= 2 dim arrays. Do we really need more though?
+ 
+@@ -936,7 +937,7 @@ createJavaObjectFromVariant(NPP instance
+                 std::string length_str = std::string();
+                 IcedTeaPluginUtilities::itoa(NPVARIANT_TO_INT32(length), &length_str);
+ 
+-                if (NPVARIANT_TO_INT32(length) > 0)
++                if (NPVARIANT_TO_INT32(length) >= 0)
+                 {
+                     NPIdentifier id_0 = browser_functions.getintidentifier(0);
+                     NPVariant first_element = NPVariant();
+@@ -956,8 +957,14 @@ createJavaObjectFromVariant(NPP instance
+                     {
+                         getArrayTypeForJava(instance, first_element, &java_array_type);
+                     }
+-                } else
+-                    java_array_type.append("jsobject");
++                }
++
++                // For JSObject arrays, we create a regular object (accessible via JSObject.getSlot())
++                if (NPVARIANT_TO_INT32(length) < 0 || !java_array_type.compare("jsobject"))
++                {
++                    isJSObjectArray = true;
++                    goto createRegularObject;
++                }
+ 
+                 java_result = java_request.newArray(java_array_type, length_str);
+ 
+@@ -995,7 +1002,10 @@ createJavaObjectFromVariant(NPP instance
+ 
+                 // Got here => no errors above. We're good to return!
+                 return;
+-            } else // Else it is not an array
++            }
++
++            createRegularObject:
++            if (!IcedTeaPluginUtilities::isObjectJSArray(instance, obj) || isJSObjectArray) // Else it is not an array
+             {
+ 
+                 NPVariant* variant_copy = new NPVariant();
+diff -up ./plugin/icedteanp/IcedTeaPluginRequestProcessor.cc.sav ./plugin/icedteanp/IcedTeaPluginRequestProcessor.cc
+--- ./plugin/icedteanp/IcedTeaPluginRequestProcessor.cc.sav	2012-03-05 17:11:53.000000000 -0500
++++ ./plugin/icedteanp/IcedTeaPluginRequestProcessor.cc	2012-03-05 17:14:29.000000000 -0500
+@@ -123,6 +123,12 @@ PluginRequestProcessor::newMessageOnBus(
+             // returns immediately, so we do it in the same thread.
+             this->sendWindow(message_parts);
+             return true;
++        } else if (!command->find("Finalize"))
++        {
++            // Object can be finalized from the main thread only. And this
++        	// call returns immediately, so we do it in the same thread.
++            this->finalize(message_parts);
++            return true;
+         } else if (!command->find("GetMember") ||
+                    !command->find("SetMember") ||
+                    !command->find("ToString") ||
+@@ -130,7 +136,6 @@ PluginRequestProcessor::newMessageOnBus(
+                    !command->find("GetSlot") ||
+                    !command->find("SetSlot") ||
+                    !command->find("Eval") ||
+-                   !command->find("Finalize") ||
+                    !command->find("LoadURL"))
+         {
+ 
+@@ -241,13 +246,9 @@ PluginRequestProcessor::eval(std::vector
+ 
+     IcedTeaPluginUtilities::callAndWaitForResult(instance, &_eval, &thread_data);
+ 
+-    NPVariant* result_variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
+-    std::string result_variant_jniid = std::string();
+-    createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid);
+-
+     IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
+     response += " JavaScriptEval ";
+-    response += result_variant_jniid;
++    response += thread_data.result;
+ 
+     plugin_to_java_bus->post(response.c_str());
+ }
+@@ -330,19 +331,9 @@ PluginRequestProcessor::call(std::vector
+ 
+     IcedTeaPluginUtilities::callAndWaitForResult(instance, &_call, &thread_data);
+ 
+-    result_variant = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
+-
+-    if (result_variant)
+-    {
+-        createJavaObjectFromVariant(instance, *result_variant, &result_variant_jniid);
+-    } else
+-    {
+-        result_variant_jniid = "0";
+-    }
+-
+     IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
+     response += " JavaScriptCall ";
+-    response += result_variant_jniid;
++    response += thread_data.result;
+ 
+     plugin_to_java_bus->post(response.c_str());
+ 
+@@ -409,7 +400,8 @@ PluginRequestProcessor::setMember(std::v
+ 
+     NPP instance;
+     NPVariant* member;
+-    NPIdentifier property_identifier;
++    std::string property_id = std::string();
++    bool int_identifier;
+ 
+     JavaRequestProcessor java_request = JavaRequestProcessor();
+     JavaResultData* java_result;
+@@ -439,7 +431,8 @@ PluginRequestProcessor::setMember(std::v
+ 
+     if (*(message_parts->at(4)) == "SetSlot")
+     {
+-        property_identifier = browser_functions.getintidentifier(atoi(message_parts->at(6)->c_str()));
++    	property_id.append(*(message_parts->at(6)));
++    	int_identifier = true;
+     } else
+     {
+         java_result = java_request.getString(propertyNameID);
+@@ -451,7 +444,8 @@ PluginRequestProcessor::setMember(std::v
+             //goto cleanup;
+         }
+ 
+-        property_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str());
++        property_id.append(*(java_result->return_string));
++    	int_identifier = false;
+     }
+ 
+     AsyncCallThreadData thread_data = AsyncCallThreadData();
+@@ -461,8 +455,9 @@ PluginRequestProcessor::setMember(std::v
+ 
+     thread_data.parameters.push_back(instance);
+     thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*member));
+-    thread_data.parameters.push_back(&property_identifier);
++    thread_data.parameters.push_back(&property_id);
+     thread_data.parameters.push_back(&value);
++    thread_data.parameters.push_back(&int_identifier);
+ 
+     IcedTeaPluginUtilities::callAndWaitForResult(instance, &_setMember, &thread_data);
+ 
+@@ -502,6 +497,7 @@ PluginRequestProcessor::sendMember(std::
+     int method_id;
+     int instance_id;
+     int reference;
++    bool int_identifier;
+ 
+     // debug printout of parent thread data
+     IcedTeaPluginUtilities::printStringPtrVector("PluginRequestProcessor::getMember:", message_parts);
+@@ -516,7 +512,7 @@ PluginRequestProcessor::sendMember(std::
+     /** Request data from Java if necessary **/
+     if (*(message_parts->at(4)) == "GetSlot")
+     {
+-        member_identifier = browser_functions.getintidentifier(atoi(member_id.c_str()));
++    	int_identifier=true;
+     } else
+     {
+         // make a new request for getString, to get the name of the identifier
+@@ -529,7 +525,8 @@ PluginRequestProcessor::sendMember(std::
+             //goto cleanup;
+         }
+ 
+-        member_identifier = browser_functions.getstringidentifier(java_result->return_string->c_str());
++        member_id.assign(*(java_result->return_string));
++    	int_identifier=false;
+     }
+ 
+     AsyncCallThreadData thread_data = AsyncCallThreadData();
+@@ -545,16 +542,11 @@ PluginRequestProcessor::sendMember(std::
+ 
+     thread_data.parameters.push_back(instance);
+     thread_data.parameters.push_back(NPVARIANT_TO_OBJECT(*parent_ptr));
+-    thread_data.parameters.push_back(&member_identifier);
++    thread_data.parameters.push_back(&member_id);
++    thread_data.parameters.push_back(&int_identifier);
+ 
+     IcedTeaPluginUtilities::callAndWaitForResult(instance, &_getMember, &thread_data);
+ 
+-    PLUGIN_DEBUG("Member PTR after internal request: %s\n", thread_data.result.c_str());
+-
+-    member_ptr = (NPVariant*) IcedTeaPluginUtilities::stringToJSID(thread_data.result);
+-
+-    createJavaObjectFromVariant(instance, *member_ptr, &result_id);
+-
+     IcedTeaPluginUtilities::constructMessagePrefix(0, reference, &response);
+     if (*(message_parts->at(2)) == "GetSlot")
+     {
+@@ -562,7 +554,7 @@ PluginRequestProcessor::sendMember(std::
+     } else {
+         response.append(" JavaScriptGetSlot ");
+     }
+-    response.append(result_id.c_str());
++    response.append(thread_data.result);
+     plugin_to_java_bus->post(response.c_str());
+ }
+ 
+@@ -714,12 +706,6 @@ queue_processor(void* data)
+                 pthread_mutex_lock(&syn_write_mutex);
+                 processor->setMember(message_parts);
+                 pthread_mutex_unlock(&syn_write_mutex);
+-            } else if (command == "Finalize")
+-            {
+-                // write methods are synchronized
+-                pthread_mutex_lock(&syn_write_mutex);
+-                processor->finalize(message_parts);
+-                pthread_mutex_unlock(&syn_write_mutex);
+             } else if (command == "LoadURL") // For instance X url <url> <target>
+             {
+                 // write methods are synchronized
+@@ -762,19 +748,26 @@ _setMember(void* data)
+     NPP instance;
+     NPVariant value_variant = NPVariant();
+     NPObject* member;
+-    NPIdentifier* property;
++    NPIdentifier property_identifier;
++
+ 
+     std::vector<void*> parameters = ((AsyncCallThreadData*) data)->parameters;
+     instance = (NPP) parameters.at(0);
+     member = (NPObject*) parameters.at(1);
+-    property = (NPIdentifier*) parameters.at(2);
++    std::string*  property_id = (std::string*) parameters.at(2);
+     value = (std::string*) parameters.at(3);
++    bool* int_identifier = (bool*) parameters.at(4);
+ 
+-    PLUGIN_DEBUG("Setting %s on instance %p, object %p to value %s\n", browser_functions.utf8fromidentifier(*property), instance, member, value->c_str());
++    if(*int_identifier==true)
++    	property_identifier = browser_functions.getintidentifier(atoi(property_id->c_str()));
++    else
++    	property_identifier = browser_functions.getstringidentifier(property_id->c_str());
++
++    PLUGIN_DEBUG("Setting %s on instance %p, object %p to value %s\n", browser_functions.utf8fromidentifier(property_identifier), instance, member, value->c_str());
+ 
+     IcedTeaPluginUtilities::javaResultToNPVariant(instance, value, &value_variant);
+ 
+-    ((AsyncCallThreadData*) data)->call_successful = browser_functions.setproperty(instance, member, *property, &value_variant);
++    ((AsyncCallThreadData*) data)->call_successful = browser_functions.setproperty(instance, member, property_identifier, &value_variant);
+ 
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ }
+@@ -791,23 +784,32 @@ _getMember(void* data)
+ 
+     instance = (NPP) parameters.at(0);
+     parent_ptr = (NPObject*) parameters.at(1);
+-    NPIdentifier* member_identifier = (NPIdentifier*) parameters.at(2);
++    std::string*  member_id = (std::string*) parameters.at(2);
++    NPIdentifier member_identifier;
++
++    bool* int_identifier = (bool*) parameters.at(3);
++
++    if(*int_identifier==true)
++    	member_identifier = browser_functions.getintidentifier(atoi(member_id->c_str()));
++    else
++    	member_identifier = browser_functions.getstringidentifier(member_id->c_str());
+ 
+     // Get the NPVariant corresponding to this member
+-    PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(*member_identifier));
++    PLUGIN_DEBUG("Looking for %p %p %p (%s)\n", instance, parent_ptr, member_identifier, browser_functions.utf8fromidentifier(member_identifier));
+ 
+-    if (!browser_functions.hasproperty(instance, parent_ptr, *member_identifier))
++    if (!browser_functions.hasproperty(instance, parent_ptr, member_identifier))
+     {
+-        printf("%s not found!\n", browser_functions.utf8fromidentifier(*member_identifier));
++        printf("%s not found!\n", browser_functions.utf8fromidentifier(member_identifier));
+     }
+-    ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, *member_identifier, member_ptr);
++    ((AsyncCallThreadData*) data)->call_successful = browser_functions.getproperty(instance, parent_ptr, member_identifier, member_ptr);
+ 
+     IcedTeaPluginUtilities::printNPVariant(*member_ptr);
+ 
+     if (((AsyncCallThreadData*) data)->call_successful)
+     {
+-        IcedTeaPluginUtilities::JSIDToString(member_ptr, &member_ptr_str);
++        createJavaObjectFromVariant(instance, *member_ptr, &member_ptr_str);
+         ((AsyncCallThreadData*) data)->result.append(member_ptr_str);
++
+     }
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ 
+@@ -825,8 +827,8 @@ _eval(void* data)
+     std::string* script_str;
+     NPIdentifier script_identifier;
+     NPString script = NPString();
+-    NPVariant* eval_result = new NPVariant();
+-    std::string eval_result_ptr_str = std::string();
++    NPVariant* eval_variant = new NPVariant();
++    std::string eval_variant_str = std::string();
+ 
+     PLUGIN_DEBUG("_eval called\n");
+ 
+@@ -848,13 +850,19 @@ _eval(void* data)
+     PLUGIN_DEBUG("Evaluating: %s\n", script.UTF8Characters);
+ #endif
+ 
+-    ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_result);
+-    IcedTeaPluginUtilities::printNPVariant(*eval_result);
++    ((AsyncCallThreadData*) data)->call_successful = browser_functions.evaluate(instance, window_ptr, &script, eval_variant);
++    IcedTeaPluginUtilities::printNPVariant(*eval_variant);
+ 
+     if (((AsyncCallThreadData*) data)->call_successful)
+     {
+-        IcedTeaPluginUtilities::JSIDToString(eval_result, &eval_result_ptr_str);
+-        ((AsyncCallThreadData*) data)->result.append(eval_result_ptr_str);
++        if (eval_variant)
++        {
++            createJavaObjectFromVariant(instance, *eval_variant, &eval_variant_str);
++        } else
++        {
++            eval_variant_str = "0";
++        }
++        ((AsyncCallThreadData*) data)->result.append(eval_variant_str);
+     }
+     ((AsyncCallThreadData*) data)->result_ready = true;
+ 
+@@ -898,7 +906,15 @@ _call(void* data)
+ 
+     if (((AsyncCallThreadData*) data)->call_successful)
+     {
+-        IcedTeaPluginUtilities::JSIDToString(call_result, &call_result_ptr_str);
++
++        if (call_result)
++        {
++            createJavaObjectFromVariant(instance, *call_result, &call_result_ptr_str);
++        } else
++        {
++        	call_result_ptr_str = "0";
++        }
++
+         ((AsyncCallThreadData*) data)->result.append(call_result_ptr_str);
+     }
+ 
diff --git a/icedtea-web.spec b/icedtea-web.spec
index 09f63dd..e374a5b 100644
--- a/icedtea-web.spec
+++ b/icedtea-web.spec
@@ -37,7 +37,7 @@
 
 Name:       icedtea-web
 Version:    1.0.6
-Release:    3%{?dist}
+Release:    4%{?dist}
 Summary:    Additional Java components for OpenJDK
 
 Group:      Applications/Internet
@@ -46,6 +46,7 @@ URL:        http://icedtea.classpath.org/wiki/IcedTea-Web
 Source0:    http://icedtea.classpath.org/download/source/%{name}-%{version}.tar.gz
 Patch0:     %{name}-%{version}-npapi-fix.patch
 Patch1:     %{name}-rh586194.patch
+Patch2:     %{name}-rh791242.patch
 
 BuildRequires:  java-1.6.0-openjdk-devel
 BuildRequires:  desktop-file-utils
@@ -95,6 +96,7 @@ This package contains Javadocs for the IcedTea-Web project.
 
 %patch0
 %patch1 -p1
+%patch2 -p1
 
 %build
 ./configure \
@@ -157,6 +159,10 @@ exit 0
 %doc COPYING
 
 %changelog
+* Mon Mar 05 2012 Deepak Bhole <dbhole at redhat.com> 1.0.6-4
+- Resolves: rhbz#791242
+- Added patch to fix crashes with Firefox 10+
+
 * Wed Dec 21 2011 Deepak Bhole <dbhole at redhat.com> 1.0.6-3
 - Add patch from upstream fix for RH586194
 


More information about the scm-commits mailing list