Changeset 140892 in webkit


Ignore:
Timestamp:
Jan 25, 2013 5:38:05 PM (11 years ago)
Author:
haraken@chromium.org
Message:

Keep a RefPtr<SerializedScriptValue*> when we call serialize()/deserialize() in code generators
https://bugs.webkit.org/show_bug.cgi?id=107902

Reviewed by Abhishek Arya.

If you use a raw SerializedScriptValue* for serialize()/deserialize(),
it can potentially cause a use-after-free. This is because serialize()/
deserialize() can destruct a RefPtr of the SerializedScriptValue*,
depending on data that is serialized/deserialized. So we should keep a
RefPtr<SerializedScriptValue*> when we call serialize()/deserialize().
(See https://bugs.webkit.org/show_bug.cgi?id=107792 for more details.)

No tests. This is just a just-in-case fix.

  • Modules/intents/Intent.h:

(WebCore::Intent::data):

  • Modules/intents/IntentRequest.cpp:

(WebCore::IntentRequest::postResult):
(WebCore::IntentRequest::postFailure):

  • Modules/intents/IntentRequest.h:

(IntentRequest):

  • Modules/intents/IntentResultCallback.h:

(IntentResultCallback):

  • bindings/scripts/CodeGeneratorJS.pm:

(GetNativeTypeForCallbacks):

  • bindings/scripts/CodeGeneratorV8.pm:

(GenerateNormalAttrGetter):
(GetNativeTypeForCallbacks):

  • bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:

(WebCore::TestSerializedScriptValueInterfaceV8Internal::cachedValueAttrGetter):
(WebCore::TestSerializedScriptValueInterfaceV8Internal::cachedReadonlyValueAttrGetter):

  • dom/MessagePortChannel.h:

(WebCore::MessagePortChannel::EventData::message):

Location:
trunk/Source/WebCore
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r140891 r140892  
     12013-01-25  Kentaro Hara  <haraken@chromium.org>
     2
     3        Keep a RefPtr<SerializedScriptValue*> when we call serialize()/deserialize() in code generators
     4        https://bugs.webkit.org/show_bug.cgi?id=107902
     5
     6        Reviewed by Abhishek Arya.
     7
     8        If you use a raw SerializedScriptValue* for serialize()/deserialize(),
     9        it can potentially cause a use-after-free. This is because serialize()/
     10        deserialize() can destruct a RefPtr of the SerializedScriptValue*,
     11        depending on data that is serialized/deserialized. So we should keep a
     12        RefPtr<SerializedScriptValue*> when we call serialize()/deserialize().
     13        (See https://bugs.webkit.org/show_bug.cgi?id=107792 for more details.)
     14
     15        No tests. This is just a just-in-case fix.
     16
     17        * Modules/intents/Intent.h:
     18        (WebCore::Intent::data):
     19        * Modules/intents/IntentRequest.cpp:
     20        (WebCore::IntentRequest::postResult):
     21        (WebCore::IntentRequest::postFailure):
     22        * Modules/intents/IntentRequest.h:
     23        (IntentRequest):
     24        * Modules/intents/IntentResultCallback.h:
     25        (IntentResultCallback):
     26        * bindings/scripts/CodeGeneratorJS.pm:
     27        (GetNativeTypeForCallbacks):
     28        * bindings/scripts/CodeGeneratorV8.pm:
     29        (GenerateNormalAttrGetter):
     30        (GetNativeTypeForCallbacks):
     31        * bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp:
     32        (WebCore::TestSerializedScriptValueInterfaceV8Internal::cachedValueAttrGetter):
     33        (WebCore::TestSerializedScriptValueInterfaceV8Internal::cachedReadonlyValueAttrGetter):
     34        * dom/MessagePortChannel.h:
     35        (WebCore::MessagePortChannel::EventData::message):
     36
    1372013-01-25  Kentaro Hara  <haraken@chromium.org>
    238
  • trunk/Source/WebCore/Modules/intents/Intent.h

    r119508 r140892  
    3737#include "MessagePortChannel.h"
    3838#include "ScriptState.h"
     39#include "SerializedScriptValue.h"
    3940#include <wtf/Forward.h>
    4041#include <wtf/PassRefPtr.h>
     
    4546
    4647namespace WebCore {
    47 
    48 class SerializedScriptValue;
    4948
    5049typedef int ExceptionCode;
     
    5958    const String& action() const { return m_action; }
    6059    const String& type() const { return m_type; }
    61     SerializedScriptValue* data() const { return m_data.get(); }
     60    PassRefPtr<SerializedScriptValue> data() const { return m_data; }
    6261
    6362    MessagePortChannelArray* messagePorts() const { return m_ports.get(); }
  • trunk/Source/WebCore/Modules/intents/IntentRequest.cpp

    r108724 r140892  
    7070}
    7171
    72 void IntentRequest::postResult(SerializedScriptValue* data)
     72void IntentRequest::postResult(PassRefPtr<SerializedScriptValue> data)
    7373{
    7474    if (m_stopped)
     
    8787}
    8888
    89 void IntentRequest::postFailure(SerializedScriptValue* data)
     89void IntentRequest::postFailure(PassRefPtr<SerializedScriptValue> data)
    9090{
    9191    if (m_stopped)
  • trunk/Source/WebCore/Modules/intents/IntentRequest.h

    r108724 r140892  
    4848    Intent* intent() { return m_intent.get(); }
    4949
    50     void postResult(SerializedScriptValue*);
    51     void postFailure(SerializedScriptValue*);
     50    void postResult(PassRefPtr<SerializedScriptValue>);
     51    void postFailure(PassRefPtr<SerializedScriptValue>);
    5252
    5353    virtual void contextDestroyed() OVERRIDE;
  • trunk/Source/WebCore/Modules/intents/IntentResultCallback.h

    r104531 r140892  
    4242public:
    4343    virtual ~IntentResultCallback() { }
    44     virtual bool handleEvent(SerializedScriptValue* result) = 0;
     44    virtual bool handleEvent(PassRefPtr<SerializedScriptValue> result) = 0;
    4545};
    4646
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r140884 r140892  
    30933093{
    30943094    my $type = shift;
    3095     return "SerializedScriptValue*" if $type eq "SerializedScriptValue";
     3095    return "PassRefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
    30963096    return "PassRefPtr<DOMStringList>" if $type eq "DOMStringList";
    30973097
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorV8.pm

    r140884 r140892  
    11121112        my $getterFunc = $codeGenerator->WK_lcfirst($attribute->signature->name);
    11131113        push(@implContentDecls, <<END);
    1114     SerializedScriptValue* serialized = imp->${getterFunc}();
     1114    RefPtr<SerializedScriptValue> serialized = imp->${getterFunc}();
    11151115    value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Null(info.GetIsolate()));
    11161116    info.Holder()->SetHiddenValue(propertyName, value);
     
    37493749    my $type = shift;
    37503750    return "const String&" if $type eq "DOMString";
    3751     return "SerializedScriptValue*" if $type eq "SerializedScriptValue";
     3751    return "PassRefPtr<SerializedScriptValue>" if $type eq "SerializedScriptValue";
    37523752
    37533753    # Callbacks use raw pointers, so pass isParameter = 1
  • trunk/Source/WebCore/bindings/scripts/test/V8/V8TestSerializedScriptValueInterface.cpp

    r140883 r140892  
    7272        return value;
    7373    TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder());
    74     SerializedScriptValue* serialized = imp->cachedValue();
     74    RefPtr<SerializedScriptValue> serialized = imp->cachedValue();
    7575    value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Null(info.GetIsolate()));
    7676    info.Holder()->SetHiddenValue(propertyName, value);
     
    107107        return value;
    108108    TestSerializedScriptValueInterface* imp = V8TestSerializedScriptValueInterface::toNative(info.Holder());
    109     SerializedScriptValue* serialized = imp->cachedReadonlyValue();
     109    RefPtr<SerializedScriptValue> serialized = imp->cachedReadonlyValue();
    110110    value = serialized ? serialized->deserialize() : v8::Handle<v8::Value>(v8Null(info.GetIsolate()));
    111111    info.Holder()->SetHiddenValue(propertyName, value);
  • trunk/Source/WebCore/dom/MessagePortChannel.h

    r127757 r140892  
    8383            static PassOwnPtr<EventData> create(PassRefPtr<SerializedScriptValue>, PassOwnPtr<MessagePortChannelArray>);
    8484
    85             SerializedScriptValue* message() { return m_message.get(); }
     85            PassRefPtr<SerializedScriptValue> message() { return m_message; }
    8686            PassOwnPtr<MessagePortChannelArray> channels() { return m_channels.release(); }
    8787
Note: See TracChangeset for help on using the changeset viewer.