mirror of
https://github.com/denoland/deno.git
synced 2024-12-22 07:14:47 -05:00
fix(serde_v8): no panic on reading large text file (#15494)
Co-authored-by: Nayeem Rahman <nayeemrmn99@gmail.com>
This commit is contained in:
parent
778eb1da24
commit
58e76098e6
3 changed files with 58 additions and 6 deletions
|
@ -145,3 +145,45 @@ Deno.test(
|
|||
assert(data.length > 0);
|
||||
},
|
||||
);
|
||||
|
||||
Deno.test(
|
||||
{ permissions: { read: true, write: true } },
|
||||
function readTextFileSyncV8LimitError() {
|
||||
const kStringMaxLengthPlusOne = 536870888 + 1;
|
||||
const bytes = new Uint8Array(kStringMaxLengthPlusOne);
|
||||
const filePath = "cli/tests/testdata/too_big_a_file.txt";
|
||||
|
||||
Deno.writeFileSync(filePath, bytes);
|
||||
|
||||
assertThrows(
|
||||
() => {
|
||||
Deno.readTextFileSync(filePath);
|
||||
},
|
||||
TypeError,
|
||||
"buffer exceeds maximum length",
|
||||
);
|
||||
|
||||
Deno.removeSync(filePath);
|
||||
},
|
||||
);
|
||||
|
||||
Deno.test(
|
||||
{ permissions: { read: true, write: true } },
|
||||
async function readTextFileV8LimitError() {
|
||||
const kStringMaxLengthPlusOne = 536870888 + 1;
|
||||
const bytes = new Uint8Array(kStringMaxLengthPlusOne);
|
||||
const filePath = "cli/tests/testdata/too_big_a_file_2.txt";
|
||||
|
||||
await Deno.writeFile(filePath, bytes);
|
||||
|
||||
await assertRejects(
|
||||
async () => {
|
||||
await Deno.readTextFile(filePath);
|
||||
},
|
||||
TypeError,
|
||||
"buffer exceeds maximum length",
|
||||
);
|
||||
|
||||
await Deno.remove(filePath);
|
||||
},
|
||||
);
|
||||
|
|
|
@ -1946,7 +1946,12 @@ impl JsRuntime {
|
|||
|
||||
for (promise_id, mut resp) in results.into_iter() {
|
||||
args.push(v8::Integer::new(scope, promise_id).into());
|
||||
args.push(resp.to_v8(scope).unwrap());
|
||||
args.push(match resp.to_v8(scope) {
|
||||
Ok(v) => v,
|
||||
Err(e) => OpResult::Err(OpError::new(&|_| "TypeError", e.into()))
|
||||
.to_v8(scope)
|
||||
.unwrap(),
|
||||
});
|
||||
}
|
||||
|
||||
let tc_scope = &mut v8::TryCatch::new(scope);
|
||||
|
|
|
@ -447,11 +447,16 @@ impl<'a, 'b, 'c> ser::Serializer for Serializer<'a, 'b, 'c> {
|
|||
}
|
||||
|
||||
fn serialize_str(self, v: &str) -> JsResult<'a> {
|
||||
Ok(
|
||||
v8::String::new(&mut self.scope.borrow_mut(), v)
|
||||
.unwrap()
|
||||
.into(),
|
||||
)
|
||||
let maybe_str = v8::String::new(&mut self.scope.borrow_mut(), v);
|
||||
|
||||
// v8 string can return 'None' if buffer length > kMaxLength.
|
||||
if let Some(str) = maybe_str {
|
||||
Ok(str.into())
|
||||
} else {
|
||||
Err(Error::Message(String::from(
|
||||
"Cannot allocate String: buffer exceeds maximum length.",
|
||||
)))
|
||||
}
|
||||
}
|
||||
|
||||
fn serialize_bytes(self, v: &[u8]) -> JsResult<'a> {
|
||||
|
|
Loading…
Reference in a new issue