Changeset 116575 in webkit


Ignore:
Timestamp:
May 9, 2012 4:56:05 PM (12 years ago)
Author:
barraclough@apple.com
Message:

GC race condition in OpaqueJSClass::prototype
https://bugs.webkit.org/show_bug.cgi?id=86034

Reviewed by Filip Pizlo.

The bug here is basically:

if (weakref) weakref->method()

where a GC may occur between the if & the method call.

  • API/JSClassRef.cpp:

(OpaqueJSClass::prototype):

Location:
trunk/Source/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/JSClassRef.cpp

    r115545 r116575  
    210210    OpaqueJSClassContextData& jsClassData = contextData(exec);
    211211
    212     if (!jsClassData.cachedPrototype) {
    213         // Recursive, but should be good enough for our purposes
    214         jsClassData.cachedPrototype = PassWeak<JSObject>(JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
    215         if (parentClass) {
    216             if (JSObject* prototype = parentClass->prototype(exec))
    217                 jsClassData.cachedPrototype->setPrototype(exec->globalData(), prototype);
    218         }
    219     }
    220     return jsClassData.cachedPrototype.get();
    221 }
     212    if (JSObject* prototype = jsClassData.cachedPrototype.get())
     213        return prototype;
     214
     215    // Recursive, but should be good enough for our purposes
     216    prototype = JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData); // set jsClassData as the object's private data, so it can clear our reference on destruction
     217    if (parentClass) {
     218        if (JSObject* parentPrototype = parentClass->prototype(exec))
     219            prototype->setPrototype(exec->globalData(), parentPrototype);
     220    }
     221
     222    jsClassData.cachedPrototype = PassWeak<JSObject>(prototype, 0);
     223    return prototype;
     224}
  • trunk/Source/JavaScriptCore/ChangeLog

    r116565 r116575  
     12012-05-09  Gavin Barraclough  <barraclough@apple.com>
     2
     3        GC race condition in OpaqueJSClass::prototype
     4        https://bugs.webkit.org/show_bug.cgi?id=86034
     5
     6        Reviewed by Filip Pizlo.
     7
     8        The bug here is basically:
     9            if (weakref) weakref->method()
     10        where a GC may occur between the if & the method call.
     11
     12        * API/JSClassRef.cpp:
     13        (OpaqueJSClass::prototype):
     14
    1152012-05-09  Mark Hahnenberg  <mhahnenberg@apple.com>
    216
Note: See TracChangeset for help on using the changeset viewer.