From: Carlos Garcia Campos Date: Fri, 6 Mar 2015 07:33:11 +0000 (+0000) Subject: Prevent unsafe access to internal types X-Git-Tag: archive/raspbian/2.14.3-1+rpi1~1^2^2^2~7 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=608dc74953239d478294f9b3acde79b09a5d3883;p=webkit2gtk.git Prevent unsafe access to internal types =================================================================== Gbp-Pq: Name serialized-script-value.patch --- diff --git a/Source/JavaScriptCore/runtime/MapData.h b/Source/JavaScriptCore/runtime/MapData.h index 615a3f4381..c0504a6759 100644 --- a/Source/JavaScriptCore/runtime/MapData.h +++ b/Source/JavaScriptCore/runtime/MapData.h @@ -42,8 +42,8 @@ public: const_iterator(const MapData*); ~const_iterator(); const WTF::KeyValuePair operator*() const; - JSValue key() const { ASSERT(!atEnd()); return m_mapData->m_entries[m_index].key.get(); } - JSValue value() const { ASSERT(!atEnd()); return m_mapData->m_entries[m_index].value.get(); } + JSValue key() const { RELEASE_ASSERT(!atEnd()); return m_mapData->m_entries[m_index].key.get(); } + JSValue value() const { RELEASE_ASSERT(!atEnd()); return m_mapData->m_entries[m_index].value.get(); } void operator++() { ASSERT(!atEnd()); internalIncrement(); } static const_iterator end(const MapData*); bool operator!=(const const_iterator& other); diff --git a/Source/WebCore/bindings/js/SerializedScriptValue.cpp b/Source/WebCore/bindings/js/SerializedScriptValue.cpp index 28f22dab0d..50221e77d5 100644 --- a/Source/WebCore/bindings/js/SerializedScriptValue.cpp +++ b/Source/WebCore/bindings/js/SerializedScriptValue.cpp @@ -1218,6 +1218,7 @@ SerializationReturnCode CloneSerializer::serialize(JSValue in) Vector inputObjectStack; Vector mapDataStack; Vector iteratorStack; + Vector iteratorValueStack; Vector stateStack; WalkerState state = StateUnknown; JSValue inValue = in; @@ -1386,16 +1387,20 @@ SerializationReturnCode CloneSerializer::serialize(JSValue in) goto objectStartVisitMember; } inValue = ptr.key(); + m_gcBuffer.append(ptr.value()); + iteratorValueStack.append(ptr.value()); stateStack.append(MapDataEndVisitKey); goto stateUnknown; } case MapDataEndVisitKey: { - inValue = iteratorStack.last().value(); + inValue = iteratorValueStack.last(); + iteratorValueStack.removeLast(); stateStack.append(MapDataEndVisitValue); goto stateUnknown; } case MapDataEndVisitValue: { - ++iteratorStack.last(); + if (iteratorStack.last() != mapDataStack.last()->end()) + ++iteratorStack.last(); goto mapDataStartVisitEntry; }