From d556d61d62cbebaa601f669f67f908eaf44151fb Mon Sep 17 00:00:00 2001 From: Ray Wang Date: Sat, 18 Sep 2021 16:46:26 +0800 Subject: [PATCH] Enable deserialization of very large serialized values. --- deps/v8/src/api/api.cc | 27 +++---------------------- deps/v8/src/objects/value-serializer.cc | 2 +- 2 files changed, 4 insertions(+), 25 deletions(-) diff --git a/deps/v8/src/api/api.cc b/deps/v8/src/api/api.cc index 84295e5cde0b28..5d5b984d8abed1 100644 --- a/deps/v8/src/api/api.cc +++ b/deps/v8/src/api/api.cc @@ -3260,7 +3260,6 @@ struct ValueDeserializer::PrivateData { : isolate(i), deserializer(i, data, delegate) {} i::Isolate* isolate; i::ValueDeserializer deserializer; - bool has_aborted = false; bool supports_legacy_wire_format = false; }; @@ -3270,16 +3269,9 @@ ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data, ValueDeserializer::ValueDeserializer(Isolate* isolate, const uint8_t* data, size_t size, Delegate* delegate) { - if (base::IsValueInRangeForNumericType(size)) { - private_ = new PrivateData( - reinterpret_cast(isolate), - base::Vector(data, static_cast(size)), delegate); - } else { - private_ = - new PrivateData(reinterpret_cast(isolate), - base::Vector(nullptr, 0), nullptr); - private_->has_aborted = true; - } + private_ = new PrivateData( + reinterpret_cast(isolate), + base::Vector(data, size), delegate); } ValueDeserializer::~ValueDeserializer() { delete private_; } @@ -3289,15 +3281,6 @@ Maybe ValueDeserializer::ReadHeader(Local context) { ENTER_V8_NO_SCRIPT(isolate, context, ValueDeserializer, ReadHeader, Nothing(), i::HandleScope); - // We could have aborted during the constructor. - // If so, ReadHeader is where we report it. - if (private_->has_aborted) { - isolate->Throw(*isolate->factory()->NewError( - i::MessageTemplate::kDataCloneDeserializationError)); - has_pending_exception = true; - RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); - } - bool read_header = false; has_pending_exception = !private_->deserializer.ReadHeader().To(&read_header); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); @@ -3321,12 +3304,10 @@ void ValueDeserializer::SetSupportsLegacyWireFormat( } uint32_t ValueDeserializer::GetWireFormatVersion() const { - CHECK(!private_->has_aborted); return private_->deserializer.GetWireFormatVersion(); } MaybeLocal ValueDeserializer::ReadValue(Local context) { - CHECK(!private_->has_aborted); PREPARE_FOR_EXECUTION(context, ValueDeserializer, ReadValue, Value); i::MaybeHandle result; if (GetWireFormatVersion() > 0) { @@ -3343,14 +3324,12 @@ MaybeLocal ValueDeserializer::ReadValue(Local context) { void ValueDeserializer::TransferArrayBuffer(uint32_t transfer_id, Local array_buffer) { - CHECK(!private_->has_aborted); private_->deserializer.TransferArrayBuffer(transfer_id, Utils::OpenHandle(*array_buffer)); } void ValueDeserializer::TransferSharedArrayBuffer( uint32_t transfer_id, Local shared_array_buffer) { - CHECK(!private_->has_aborted); private_->deserializer.TransferArrayBuffer( transfer_id, Utils::OpenHandle(*shared_array_buffer)); } diff --git a/deps/v8/src/objects/value-serializer.cc b/deps/v8/src/objects/value-serializer.cc index a2345102c90965..ebd4bc050fffb6 100644 --- a/deps/v8/src/objects/value-serializer.cc +++ b/deps/v8/src/objects/value-serializer.cc @@ -1117,7 +1117,7 @@ ValueDeserializer::ValueDeserializer(Isolate* isolate, : isolate_(isolate), delegate_(delegate), position_(data.begin()), - end_(data.begin() + data.length()), + end_(data.end()), id_map_(isolate->global_handles()->Create( ReadOnlyRoots(isolate_).empty_fixed_array())) {}