Title: [224055] trunk
Revision
224055
Author
[email protected]
Date
2017-10-26 15:36:04 -0700 (Thu, 26 Oct 2017)

Log Message

JSRopeString::RopeBuilder::append() should check for overflows.
https://bugs.webkit.org/show_bug.cgi?id=178385
<rdar://problem/35027468>

Reviewed by Saam Barati.

JSTests:

* stress/regress-178385.js: Added.

Source/_javascript_Core:

1. Made RopeString check for overflow like the Checked class does.
2. Added a missing overflow check in objectProtoFuncToString().

* runtime/JSString.cpp:
(JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
(JSC::JSRopeString::RopeBuilder::expand): Deleted.
* runtime/JSString.h:
* runtime/ObjectPrototype.cpp:
(JSC::objectProtoFuncToString):
* runtime/Operations.h:
(JSC::jsStringFromRegisterArray):
(JSC::jsStringFromArguments):

Source/WTF:

* wtf/CheckedArithmetic.h:

Modified Paths

Added Paths

Diff

Modified: trunk/JSTests/ChangeLog (224054 => 224055)


--- trunk/JSTests/ChangeLog	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/JSTests/ChangeLog	2017-10-26 22:36:04 UTC (rev 224055)
@@ -1,3 +1,13 @@
+2017-10-26  Mark Lam  <[email protected]>
+
+        JSRopeString::RopeBuilder::append() should check for overflows.
+        https://bugs.webkit.org/show_bug.cgi?id=178385
+        <rdar://problem/35027468>
+
+        Reviewed by Saam Barati.
+
+        * stress/regress-178385.js: Added.
+
 2017-10-26  Ryan Haddad  <[email protected]>
 
         Unreviewed, rolling out r223961.

Added: trunk/JSTests/stress/regress-178385.js (0 => 224055)


--- trunk/JSTests/stress/regress-178385.js	                        (rev 0)
+++ trunk/JSTests/stress/regress-178385.js	2017-10-26 22:36:04 UTC (rev 224055)
@@ -0,0 +1,14 @@
+
+var exception;
+try {
+    var str0 = new String('@hBg');
+    var collat3 = new Intl.Collator();
+    str10 = str0.padEnd(0x7FFFFFFC, 1);
+    collat3[Symbol.toStringTag] = str10;
+    collat3.toLocaleString();
+} catch (e) {
+    exception = e;
+}
+
+if (exception != "Error: Out of memory")
+    throw "FAILED";

Modified: trunk/Source/_javascript_Core/ChangeLog (224054 => 224055)


--- trunk/Source/_javascript_Core/ChangeLog	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/_javascript_Core/ChangeLog	2017-10-26 22:36:04 UTC (rev 224055)
@@ -1,3 +1,24 @@
+2017-10-26  Mark Lam  <[email protected]>
+
+        JSRopeString::RopeBuilder::append() should check for overflows.
+        https://bugs.webkit.org/show_bug.cgi?id=178385
+        <rdar://problem/35027468>
+
+        Reviewed by Saam Barati.
+
+        1. Made RopeString check for overflow like the Checked class does.
+        2. Added a missing overflow check in objectProtoFuncToString().
+
+        * runtime/JSString.cpp:
+        (JSC::JSRopeString::RopeBuilder<RecordOverflow>::expand):
+        (JSC::JSRopeString::RopeBuilder::expand): Deleted.
+        * runtime/JSString.h:
+        * runtime/ObjectPrototype.cpp:
+        (JSC::objectProtoFuncToString):
+        * runtime/Operations.h:
+        (JSC::jsStringFromRegisterArray):
+        (JSC::jsStringFromArguments):
+
 2017-10-26  JF Bastien  <[email protected]>
 
         WebAssembly: no VM / JS version of our implementation

Modified: trunk/Source/_javascript_Core/runtime/JSString.cpp (224054 => 224055)


--- trunk/Source/_javascript_Core/runtime/JSString.cpp	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/_javascript_Core/runtime/JSString.cpp	2017-10-26 22:36:04 UTC (rev 224055)
@@ -40,11 +40,12 @@
     return Structure::create(vm, globalObject, proto, TypeInfo(StringType, StructureFlags), info());
 }
 
-void JSRopeString::RopeBuilder::expand()
+template<>
+void JSRopeString::RopeBuilder<RecordOverflow>::expand()
 {
+    RELEASE_ASSERT(!this->hasOverflowed());
     ASSERT(m_index == JSRopeString::s_maxInternalRopeLength);
     JSString* jsString = m_jsString;
-    RELEASE_ASSERT(jsString);
     m_jsString = jsStringBuilder(&m_vm);
     m_index = 0;
     append(jsString);

Modified: trunk/Source/_javascript_Core/runtime/JSString.h (224054 => 224055)


--- trunk/Source/_javascript_Core/runtime/JSString.h	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/_javascript_Core/runtime/JSString.h	2017-10-26 22:36:04 UTC (rev 224055)
@@ -30,6 +30,7 @@
 #include "Structure.h"
 #include "ThrowScope.h"
 #include <array>
+#include <wtf/CheckedArithmetic.h>
 #include <wtf/text/StringView.h>
 
 namespace JSC {
@@ -242,7 +243,8 @@
     friend JSRopeString* jsStringBuilder(VM*);
 
 public:
-    class RopeBuilder {
+    template <class OverflowHandler = CrashOnOverflow>
+    class RopeBuilder : public OverflowHandler {
     public:
         RopeBuilder(VM& vm)
             : m_vm(vm)
@@ -253,10 +255,12 @@
 
         bool append(JSString* jsString)
         {
+            if (UNLIKELY(this->hasOverflowed()))
+                return false;
             if (m_index == JSRopeString::s_maxInternalRopeLength)
                 expand();
             if (static_cast<int32_t>(m_jsString->length() + jsString->length()) < 0) {
-                m_jsString = nullptr;
+                this->overflowed();
                 return false;
             }
             m_jsString->append(m_vm, m_index++, jsString);
@@ -265,13 +269,17 @@
 
         JSRopeString* release()
         {
-            RELEASE_ASSERT(m_jsString);
+            RELEASE_ASSERT(!this->hasOverflowed());
             JSRopeString* tmp = m_jsString;
-            m_jsString = 0;
+            m_jsString = nullptr;
             return tmp;
         }
 
-        unsigned length() const { return m_jsString->length(); }
+        unsigned length() const
+        {
+            ASSERT(!this->hasOverflowed());
+            return m_jsString->length();
+        }
 
     private:
         void expand();

Modified: trunk/Source/_javascript_Core/runtime/ObjectPrototype.cpp (224054 => 224055)


--- trunk/Source/_javascript_Core/runtime/ObjectPrototype.cpp	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/_javascript_Core/runtime/ObjectPrototype.cpp	2017-10-26 22:36:04 UTC (rev 224055)
@@ -334,12 +334,14 @@
             JSValue stringTag = toStringTagSlot.getValue(exec, toStringTagSymbol);
             RETURN_IF_EXCEPTION(scope, { });
             if (stringTag.isString()) {
-                JSRopeString::RopeBuilder ropeBuilder(vm);
+                JSRopeString::RopeBuilder<RecordOverflow> ropeBuilder(vm);
                 ropeBuilder.append(vm.smallStrings.objectStringStart());
                 ropeBuilder.append(asString(stringTag));
                 ropeBuilder.append(vm.smallStrings.singleCharacterString(']'));
+                if (ropeBuilder.hasOverflowed())
+                    return throwOutOfMemoryError(exec, scope);
+
                 JSString* result = ropeBuilder.release();
-
                 thisObject->structure(vm)->setObjectToStringValue(exec, vm, result, toStringTagSlot);
                 return result;
             }

Modified: trunk/Source/_javascript_Core/runtime/Operations.h (224054 => 224055)


--- trunk/Source/_javascript_Core/runtime/Operations.h	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/_javascript_Core/runtime/Operations.h	2017-10-26 22:36:04 UTC (rev 224055)
@@ -122,7 +122,7 @@
 {
     VM* vm = &exec->vm();
     auto scope = DECLARE_THROW_SCOPE(*vm);
-    JSRopeString::RopeBuilder ropeBuilder(*vm);
+    JSRopeString::RopeBuilder<RecordOverflow> ropeBuilder(*vm);
 
     for (unsigned i = 0; i < count; ++i) {
         JSValue v = strings[-static_cast<int>(i)].jsValue();
@@ -139,7 +139,7 @@
 {
     VM* vm = &exec->vm();
     auto scope = DECLARE_THROW_SCOPE(*vm);
-    JSRopeString::RopeBuilder ropeBuilder(*vm);
+    JSRopeString::RopeBuilder<RecordOverflow> ropeBuilder(*vm);
     JSString* str = thisValue.toString(exec);
     RETURN_IF_EXCEPTION(scope, { });
     ropeBuilder.append(str);

Modified: trunk/Source/WTF/ChangeLog (224054 => 224055)


--- trunk/Source/WTF/ChangeLog	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/WTF/ChangeLog	2017-10-26 22:36:04 UTC (rev 224055)
@@ -1,3 +1,13 @@
+2017-10-26  Mark Lam  <[email protected]>
+
+        JSRopeString::RopeBuilder::append() should check for overflows.
+        https://bugs.webkit.org/show_bug.cgi?id=178385
+        <rdar://problem/35027468>
+
+        Reviewed by Saam Barati.
+
+        * wtf/CheckedArithmetic.h:
+
 2017-10-25  Commit Queue  <[email protected]>
 
         Unreviewed, rolling out r222945.

Modified: trunk/Source/WTF/wtf/CheckedArithmetic.h (224054 => 224055)


--- trunk/Source/WTF/wtf/CheckedArithmetic.h	2017-10-26 22:25:06 UTC (rev 224054)
+++ trunk/Source/WTF/wtf/CheckedArithmetic.h	2017-10-26 22:36:04 UTC (rev 224055)
@@ -834,7 +834,6 @@
 
 using WTF::Checked;
 using WTF::CheckedState;
-using WTF::RecordOverflow;
 using WTF::CheckedInt8;
 using WTF::CheckedUint8;
 using WTF::CheckedInt16;
@@ -844,6 +843,8 @@
 using WTF::CheckedInt64;
 using WTF::CheckedUint64;
 using WTF::CheckedSize;
+using WTF::CrashOnOverflow;
+using WTF::RecordOverflow;
 using WTF::checkedSum;
 using WTF::differenceOverflows;
 using WTF::productOverflows;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to