JavaScriptCore: missing exception checks in Math functions that take more than one...
authorjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Dec 2017 05:44:04 +0000 (05:44 +0000)
committerjfbastien@apple.com <jfbastien@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 2 Dec 2017 05:44:04 +0000 (05:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=180297
<rdar://problem/35745556>

Reviewed by Mark Lam.

JSTests:

* stress/math-exceptions.js: Added.
(get try):
(catch):

Source/JavaScriptCore:

* runtime/MathObject.cpp:
(JSC::mathProtoFuncATan2):
(JSC::mathProtoFuncMax):
(JSC::mathProtoFuncMin):
(JSC::mathProtoFuncPow):

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

JSTests/ChangeLog
JSTests/stress/math-exceptions.js [new file with mode: 0644]
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/runtime/MathObject.cpp

index 3dd0be5..53948b1 100644 (file)
@@ -1,5 +1,17 @@
 2017-12-01  JF Bastien  <jfbastien@apple.com>
 
+        JavaScriptCore: missing exception checks in Math functions that take more than one argument
+        https://bugs.webkit.org/show_bug.cgi?id=180297
+        <rdar://problem/35745556>
+
+        Reviewed by Mark Lam.
+
+        * stress/math-exceptions.js: Added.
+        (get try):
+        (catch):
+
+2017-12-01  JF Bastien  <jfbastien@apple.com>
+
         JavaScriptCore: add test for weird class static getters
         https://bugs.webkit.org/show_bug.cgi?id=180281
         <rdar://problem/35592139>
diff --git a/JSTests/stress/math-exceptions.js b/JSTests/stress/math-exceptions.js
new file mode 100644 (file)
index 0000000..1af6bee
--- /dev/null
@@ -0,0 +1,47 @@
+const foo = new Proxy({}, {
+    get() { throw 0xc0defefe; }
+});
+
+const bar = new Proxy({}, {
+    get() { throw 0xdeadbeef; }
+});
+
+const check = value => {
+    if (value !== 0xc0defefe)
+        throw new Error(`bad ${value}!`);
+}
+
+try { Math.acos(foo, bar); } catch (e) { check(e); }
+try { Math.acosh(foo, bar); } catch (e) { check(e); }
+try { Math.asin(foo, bar); } catch (e) { check(e); }
+try { Math.asinh(foo, bar); } catch (e) { check(e); }
+try { Math.atan(foo, bar); } catch (e) { check(e); }
+try { Math.atanh(foo, bar); } catch (e) { check(e); }
+try { Math.atan2(foo, bar); } catch (e) { check(e); }
+try { Math.cbrt(foo, bar); } catch (e) { check(e); }
+try { Math.ceil(foo, bar); } catch (e) { check(e); }
+try { Math.clz32(foo, bar); } catch (e) { check(e); }
+try { Math.cos(foo, bar); } catch (e) { check(e); }
+try { Math.cosh(foo, bar); } catch (e) { check(e); }
+try { Math.exp(foo, bar); } catch (e) { check(e); }
+try { Math.expm1(foo, bar); } catch (e) { check(e); }
+try { Math.floor(foo, bar); } catch (e) { check(e); }
+try { Math.fround(foo, bar); } catch (e) { check(e); }
+try { Math.hypot(foo, bar); } catch (e) { check(e); }
+try { Math.imul(foo, bar); } catch (e) { check(e); }
+try { Math.log(foo, bar); } catch (e) { check(e); }
+try { Math.log1p(foo, bar); } catch (e) { check(e); }
+try { Math.log10(foo, bar); } catch (e) { check(e); }
+try { Math.log2(foo, bar); } catch (e) { check(e); }
+try { Math.max(foo, bar); } catch (e) { check(e); }
+try { Math.min(foo, bar); } catch (e) { check(e); }
+try { Math.pow(foo, bar); } catch (e) { check(e); }
+Math.random(foo, bar);
+try { Math.round(foo, bar); } catch (e) { check(e); }
+try { Math.sign(foo, bar); } catch (e) { check(e); }
+try { Math.sin(foo, bar); } catch (e) { check(e); }
+try { Math.sinh(foo, bar); } catch (e) { check(e); }
+try { Math.sqrt(foo, bar); } catch (e) { check(e); }
+try { Math.tan(foo, bar); } catch (e) { check(e); }
+try { Math.tanh(foo, bar); } catch (e) { check(e); }
+try { Math.trunc(foo, bar); } catch (e) { check(e); }
index 4a85cb4..fd28e3b 100644 (file)
@@ -1,3 +1,17 @@
+2017-12-01  JF Bastien  <jfbastien@apple.com>
+
+        JavaScriptCore: missing exception checks in Math functions that take more than one argument
+        https://bugs.webkit.org/show_bug.cgi?id=180297
+        <rdar://problem/35745556>
+
+        Reviewed by Mark Lam.
+
+        * runtime/MathObject.cpp:
+        (JSC::mathProtoFuncATan2):
+        (JSC::mathProtoFuncMax):
+        (JSC::mathProtoFuncMin):
+        (JSC::mathProtoFuncPow):
+
 2017-12-01  Mark Lam  <mark.lam@apple.com>
 
         Let's scramble ClassInfo pointers in cells.
index 31cc0f5..5cd5359 100644 (file)
@@ -149,8 +149,12 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncATan(ExecState* exec)
 
 EncodedJSValue JSC_HOST_CALL mathProtoFuncATan2(ExecState* exec)
 {
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
     double arg0 = exec->argument(0).toNumber(exec);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
     double arg1 = exec->argument(1).toNumber(exec);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
     return JSValue::encode(jsDoubleNumber(atan2(arg0, arg1)));
 }
 
@@ -220,10 +224,13 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncLog(ExecState* exec)
 
 EncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState* exec)
 {
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
     unsigned argsCount = exec->argumentCount();
     double result = -std::numeric_limits<double>::infinity();
     for (unsigned k = 0; k < argsCount; ++k) {
         double val = exec->uncheckedArgument(k).toNumber(exec);
+        RETURN_IF_EXCEPTION(scope, encodedJSValue());
         if (std::isnan(val)) {
             result = PNaN;
         } else if (val > result || (!val && !result && !std::signbit(val)))
@@ -234,10 +241,13 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncMax(ExecState* exec)
 
 EncodedJSValue JSC_HOST_CALL mathProtoFuncMin(ExecState* exec)
 {
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
     unsigned argsCount = exec->argumentCount();
     double result = +std::numeric_limits<double>::infinity();
     for (unsigned k = 0; k < argsCount; ++k) {
         double val = exec->uncheckedArgument(k).toNumber(exec);
+        RETURN_IF_EXCEPTION(scope, encodedJSValue());
         if (std::isnan(val)) {
             result = PNaN;
         } else if (val < result || (!val && !result && std::signbit(val)))
@@ -250,8 +260,13 @@ EncodedJSValue JSC_HOST_CALL mathProtoFuncPow(ExecState* exec)
 {
     // ECMA 15.8.2.1.13
 
+    VM& vm = exec->vm();
+    auto scope = DECLARE_THROW_SCOPE(vm);
+
     double arg = exec->argument(0).toNumber(exec);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
     double arg2 = exec->argument(1).toNumber(exec);
+    RETURN_IF_EXCEPTION(scope, encodedJSValue());
 
     return JSValue::encode(JSValue(operationMathPow(arg, arg2)));
 }