mirror of
https://github.com/denoland/deno.git
synced 2025-03-03 09:31:22 -05:00
fix(core): panic on big string allocation (#7395)
Co-authored-by: Bert Belder <bertbelder@gmail.com>
This commit is contained in:
parent
71a987942a
commit
25053f92ff
2 changed files with 27 additions and 3 deletions
|
@ -673,9 +673,22 @@ fn decode(
|
|||
)
|
||||
};
|
||||
|
||||
let text_str =
|
||||
v8::String::new_from_utf8(scope, &buf, v8::NewStringType::Normal).unwrap();
|
||||
rv.set(text_str.into())
|
||||
// If `String::new_from_utf8()` returns `None`, this means that the
|
||||
// length of the decoded string would be longer than what V8 can
|
||||
// handle. In this case we return `RangeError`.
|
||||
//
|
||||
// For more details see:
|
||||
// - https://encoding.spec.whatwg.org/#dom-textdecoder-decode
|
||||
// - https://github.com/denoland/deno/issues/6649
|
||||
// - https://github.com/v8/v8/blob/d68fb4733e39525f9ff0a9222107c02c28096e2a/include/v8.h#L3277-L3278
|
||||
match v8::String::new_from_utf8(scope, &buf, v8::NewStringType::Normal) {
|
||||
Some(text) => rv.set(text.into()),
|
||||
None => {
|
||||
let msg = v8::String::new(scope, "string too long").unwrap();
|
||||
let exception = v8::Exception::range_error(scope, msg);
|
||||
scope.throw_exception(exception);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
fn queue_microtask(
|
||||
|
|
|
@ -41,6 +41,17 @@ function main() {
|
|||
|
||||
assert(Deno.core.decode(new Uint8Array(fixture1)) === "𝓽𝓮𝔁𝓽");
|
||||
assert(Deno.core.decode(new Uint8Array(fixture2)) === "Hello <20><> World");
|
||||
|
||||
// See https://github.com/denoland/deno/issues/6649
|
||||
let thrown = false;
|
||||
try {
|
||||
Deno.core.decode(new Uint8Array(2 ** 29));
|
||||
} catch (e) {
|
||||
thrown = true;
|
||||
assert(e instanceof RangeError);
|
||||
assert(e.message === "string too long");
|
||||
}
|
||||
assert(thrown);
|
||||
}
|
||||
|
||||
main();
|
||||
|
|
Loading…
Add table
Reference in a new issue