diff options
Diffstat (limited to 'serde_v8')
-rw-r--r-- | serde_v8/error.rs | 3 | ||||
-rw-r--r-- | serde_v8/magic/v8slice.rs | 13 | ||||
-rw-r--r-- | serde_v8/tests/de.rs | 10 |
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 |