String overflow in JSC::createError results in ASSERT in WTF::makeString
authortzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 19 Dec 2018 11:33:12 +0000 (11:33 +0000)
committertzagallo@apple.com <tzagallo@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 19 Dec 2018 11:33:12 +0000 (11:33 +0000)
https://bugs.webkit.org/show_bug.cgi?id=192833
<rdar://problem/45706868>

Reviewed by Mark Lam.

JSTests:

* stress/string-overflow-createError.js: Added.

Source/JavaScriptCore:

JSC::createError was calling WTF::makeString which would result in an
assertion failure when the string was too big. Change it to call
WTF::tryMakeString instead and return an OutOfMemory error if we fail
to create the error string.

* runtime/ExceptionHelpers.cpp:
(JSC::createError):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@239375 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JSTests/ChangeLog
JSTests/stress/string-overflow-createError.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/ExceptionHelpers.cpp

index dbd5b3c..2e9900f 100644 (file)
@@ -1,3 +1,13 @@
+2018-12-19  Tadeu Zagallo  <tzagallo@apple.com>
+
+        String overflow in JSC::createError results in ASSERT in WTF::makeString
+        https://bugs.webkit.org/show_bug.cgi?id=192833
+        <rdar://problem/45706868>
+
+        Reviewed by Mark Lam.
+
+        * stress/string-overflow-createError.js: Added.
+
 2018-12-18  Ross Kirsling  <ross.kirsling@sony.com>
 
         Error message for `-x ** y` contains a typo.
diff --git a/JSTests/stress/string-overflow-createError.js b/JSTests/stress/string-overflow-createError.js
new file mode 100644 (file)
index 0000000..01d95ad
--- /dev/null
@@ -0,0 +1,11 @@
+var exception;
+try {
+    bar = '2.3023e-320'
+    foo = bar.padEnd(2147483644, 1);
+    foo(true, 1).value;
+} catch (e) {
+    exception = e;
+}
+
+if (exception != "Error: Out of memory")
+    throw "FAILED";
index 34dab99..b6d34d6 100644 (file)
@@ -1,3 +1,19 @@
+2018-12-19  Tadeu Zagallo  <tzagallo@apple.com>
+
+        String overflow in JSC::createError results in ASSERT in WTF::makeString
+        https://bugs.webkit.org/show_bug.cgi?id=192833
+        <rdar://problem/45706868>
+
+        Reviewed by Mark Lam.
+
+        JSC::createError was calling WTF::makeString which would result in an
+        assertion failure when the string was too big. Change it to call
+        WTF::tryMakeString instead and return an OutOfMemory error if we fail
+        to create the error string.
+
+        * runtime/ExceptionHelpers.cpp:
+        (JSC::createError):
+
 2018-12-18  Ross Kirsling  <ross.kirsling@sony.com>
 
         Error message for `-x ** y` contains a typo.
index 20cb5fc..8a617b4 100644 (file)
@@ -267,7 +267,9 @@ JSObject* createError(ExecState* exec, JSValue value, const String& message, Err
     VM& vm = exec->vm();
     auto scope = DECLARE_CATCH_SCOPE(vm);
 
-    String errorMessage = makeString(errorDescriptionForValue(exec, value)->value(exec), ' ', message);
+    String errorMessage = tryMakeString(errorDescriptionForValue(exec, value)->value(exec), ' ', message);
+    if (errorMessage.isNull())
+        return createOutOfMemoryError(exec);
     scope.assertNoException();
     JSObject* exception = createTypeError(exec, errorMessage, appender, runtimeTypeForValue(vm, value));
     ASSERT(exception->isErrorInstance());