Skip to content

Commit d776671

Browse files
committed
Fix handling of large negative Error.stackTraceLimit.
1 parent 33cf4b0 commit d776671

File tree

3 files changed

+13
-6
lines changed

3 files changed

+13
-6
lines changed

graal-js/src/com.oracle.truffle.js.test/js/runtime/error_stacktracelimit.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,14 @@ assertThrows(() => recurse(20), MyError);
4646
Object.defineProperty(Error, "stackTraceLimit", {value: 5, configurable: true, writable: true})
4747
assertThrows(() => recurse(20), MyError, e => assertSame(5, countOccurrences(e.stack, 'recurse')));
4848

49+
// stackTraceLimit missing or not of type Number.
50+
var emptyStack = e => {assertSame(0, countOccurrences(String(e.stack), 'recurse')); assertSame(true, 'stack' in e);};
51+
4952
Error.stackTraceLimit = 0;
50-
assertThrows(() => recurse(20), MyError, e => {assertSame(0, countOccurrences(String(e.stack), 'recurse')); assertSame(true, 'stack' in e);});
53+
assertThrows(() => recurse(20), MyError, emptyStack);
54+
55+
Error.stackTraceLimit = -2147483649;
56+
assertThrows(() => recurse(20), MyError, emptyStack);
5157

5258
// stackTraceLimit missing or not of type Number.
5359
var invalidLimit = e => {assertSame(0, countOccurrences(String(e.stack), 'recurse')); assertSame(true, 'stack' in e);};

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/nodes/access/ErrorStackTraceLimitNode.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
import com.oracle.truffle.api.object.DynamicObjectLibrary;
4646
import com.oracle.truffle.js.nodes.JavaScriptBaseNode;
4747
import com.oracle.truffle.js.nodes.cast.IsNumberNode;
48-
import com.oracle.truffle.js.nodes.cast.JSToIntegerAsIntNode;
48+
import com.oracle.truffle.js.nodes.cast.JSToIntegerAsLongNode;
4949
import com.oracle.truffle.js.runtime.JSContext;
5050
import com.oracle.truffle.js.runtime.JSErrorType;
5151
import com.oracle.truffle.js.runtime.builtins.JSError;
@@ -57,13 +57,13 @@ public abstract class ErrorStackTraceLimitNode extends JavaScriptBaseNode {
5757
private final JSContext context;
5858
@Child private DynamicObjectLibrary getStackTraceLimit;
5959
@Child private IsNumberNode isNumber;
60-
@Child private JSToIntegerAsIntNode toInteger;
60+
@Child private JSToIntegerAsLongNode toInteger;
6161

6262
protected ErrorStackTraceLimitNode(JSContext context) {
6363
this.context = context;
6464
this.getStackTraceLimit = JSObjectUtil.createDispatched(JSError.STACK_TRACE_LIMIT_PROPERTY_NAME);
6565
this.isNumber = IsNumberNode.create();
66-
this.toInteger = JSToIntegerAsIntNode.create();
66+
this.toInteger = JSToIntegerAsLongNode.create();
6767
}
6868

6969
public static ErrorStackTraceLimitNode create(JSContext context) {
@@ -76,7 +76,8 @@ public int doInt() {
7676
if (JSProperty.isData(getStackTraceLimit.getPropertyFlagsOrDefault(errorConstructor, JSError.STACK_TRACE_LIMIT_PROPERTY_NAME, JSProperty.ACCESSOR))) {
7777
Object value = getStackTraceLimit.getOrDefault(errorConstructor, JSError.STACK_TRACE_LIMIT_PROPERTY_NAME, Undefined.instance);
7878
if (isNumber.execute(value)) {
79-
return Math.max(0, toInteger.executeInt(value));
79+
long limit = toInteger.executeLong(value);
80+
return (int) Math.max(0, Math.min(limit, Integer.MAX_VALUE));
8081
}
8182
}
8283
return 0;

graal-js/src/com.oracle.truffle.js/src/com/oracle/truffle/js/runtime/JSException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ public static int getStackTraceLimit(JSRealm realm) {
146146
Object stackTraceLimit = lib.getOrDefault(errorConstructor, JSError.STACK_TRACE_LIMIT_PROPERTY_NAME, Undefined.instance);
147147
if (JSRuntime.isNumber(stackTraceLimit)) {
148148
final long limit = JSRuntime.toInteger(stackTraceLimit);
149-
return Math.max(0, limit > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) limit);
149+
return (int) Math.max(0, Math.min(limit, Integer.MAX_VALUE));
150150
}
151151
}
152152
return 0;

0 commit comments

Comments
 (0)