summaryrefslogtreecommitdiff
path: root/serde_v8
diff options
context:
space:
mode:
Diffstat (limited to 'serde_v8')
-rw-r--r--serde_v8/error.rs3
-rw-r--r--serde_v8/magic/v8slice.rs13
-rw-r--r--serde_v8/tests/de.rs10
3 files changed, 23 insertions, 3 deletions
diff --git a/serde_v8/error.rs b/serde_v8/error.rs
index aa2d92bf8..16d7882b7 100644
--- a/serde_v8/error.rs
+++ b/serde_v8/error.rs
@@ -55,6 +55,9 @@ pub enum Error {
#[error("serde_v8 error: length mismatch, got: {0}, expected: {1}")]
LengthMismatch(usize, usize),
+
+ #[error("serde_v8 error: can't create slice from resizable ArrayBuffer")]
+ ResizableBackingStoreNotSupported,
}
impl serde::ser::Error for Error {
diff --git a/serde_v8/magic/v8slice.rs b/serde_v8/magic/v8slice.rs
index 073e75235..b1dd89770 100644
--- a/serde_v8/magic/v8slice.rs
+++ b/serde_v8/magic/v8slice.rs
@@ -91,9 +91,16 @@ impl FromV8 for V8Slice {
scope: &mut v8::HandleScope,
value: v8::Local<v8::Value>,
) -> Result<Self, crate::Error> {
- to_ranged_buffer(scope, value)
- .and_then(|(b, r)| Self::from_buffer(b, r))
- .map_err(|_| crate::Error::ExpectedBuffer(value_to_type_str(value)))
+ match to_ranged_buffer(scope, value) {
+ Ok((b, r)) => {
+ if b.get_backing_store().is_resizable_by_user_javascript() {
+ return Err(crate::Error::ResizableBackingStoreNotSupported);
+ }
+ Self::from_buffer(b, r)
+ .map_err(|_| crate::Error::ExpectedBuffer(value_to_type_str(value)))
+ }
+ Err(_) => Err(crate::Error::ExpectedBuffer(value_to_type_str(value))),
+ }
}
}
diff --git a/serde_v8/tests/de.rs b/serde_v8/tests/de.rs
index 4e5e1e4b9..4c5cf7283 100644
--- a/serde_v8/tests/de.rs
+++ b/serde_v8/tests/de.rs
@@ -265,6 +265,16 @@ fn de_buffers() {
assert_eq!(&*buf, &[0x68, 0x65, 0x6C, 0x6C, 0x6F]);
},
);
+
+ dedo("(new ArrayBuffer(4))", |scope, v| {
+ let buf: ZeroCopyBuf = serde_v8::from_v8(scope, v).unwrap();
+ assert_eq!(&*buf, &[0x0, 0x0, 0x0, 0x0]);
+ });
+
+ dedo("(new ArrayBuffer(8, { maxByteLength: 16}))", |scope, v| {
+ let result: Result<ZeroCopyBuf, Error> = serde_v8::from_v8(scope, v);
+ matches!(result, Err(Error::ResizableBackingStoreNotSupported));
+ });
}
// Structs