summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/unit/buffer_test.ts13
-rw-r--r--serde_v8/magic/u16string.rs15
2 files changed, 24 insertions, 4 deletions
diff --git a/cli/tests/unit/buffer_test.ts b/cli/tests/unit/buffer_test.ts
index 445c946e2..41d7e4d7f 100644
--- a/cli/tests/unit/buffer_test.ts
+++ b/cli/tests/unit/buffer_test.ts
@@ -446,3 +446,16 @@ Deno.test(function testBufferBytesCopyFalseGrowExactBytes() {
assertEquals(actualBytes.byteLength, bufSize);
assertEquals(actualBytes.buffer.byteLength, actualBytes.byteLength);
});
+
+Deno.test(function testThrowsErrorWhenBufferExceedsMaxLength() {
+ const kStringMaxLengthPlusOne = 536870888 + 1;
+ const bytes = new Uint8Array(kStringMaxLengthPlusOne);
+
+ assertThrows(
+ () => {
+ new TextDecoder().decode(bytes);
+ },
+ TypeError,
+ "buffer exceeds maximum length",
+ );
+});
diff --git a/serde_v8/magic/u16string.rs b/serde_v8/magic/u16string.rs
index c1d080ac7..e304ea187 100644
--- a/serde_v8/magic/u16string.rs
+++ b/serde_v8/magic/u16string.rs
@@ -11,10 +11,17 @@ impl ToV8 for U16String {
&self,
scope: &mut v8::HandleScope<'a>,
) -> Result<v8::Local<'a, v8::Value>, crate::Error> {
- let v =
- v8::String::new_from_two_byte(scope, self, v8::NewStringType::Normal)
- .unwrap();
- Ok(v.into())
+ let maybe_v =
+ v8::String::new_from_two_byte(scope, self, v8::NewStringType::Normal);
+
+ // 'new_from_two_byte' can return 'None' if buffer length > kMaxLength.
+ if let Some(v) = maybe_v {
+ Ok(v.into())
+ } else {
+ Err(Error::Message(String::from(
+ "Cannot allocate String from UTF-16: buffer exceeds maximum length.",
+ )))
+ }
}
}