Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(277)

Side by Side Diff: src/value-serializer.cc

Issue 2570433005: Disallow passing a SharedArrayBuffer in the transfer list. (Closed)
Patch Set: Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 the V8 project authors. All rights reserved. 1 // Copyright 2016 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/value-serializer.h" 5 #include "src/value-serializer.h"
6 6
7 #include <type_traits> 7 #include <type_traits>
8 8
9 #include "src/base/logging.h" 9 #include "src/base/logging.h"
10 #include "src/conversions.h" 10 #include "src/conversions.h"
(...skipping 424 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 case JS_VALUE_TYPE: 435 case JS_VALUE_TYPE:
436 return WriteJSValue(Handle<JSValue>::cast(receiver)); 436 return WriteJSValue(Handle<JSValue>::cast(receiver));
437 case JS_REGEXP_TYPE: 437 case JS_REGEXP_TYPE:
438 WriteJSRegExp(JSRegExp::cast(*receiver)); 438 WriteJSRegExp(JSRegExp::cast(*receiver));
439 return Just(true); 439 return Just(true);
440 case JS_MAP_TYPE: 440 case JS_MAP_TYPE:
441 return WriteJSMap(Handle<JSMap>::cast(receiver)); 441 return WriteJSMap(Handle<JSMap>::cast(receiver));
442 case JS_SET_TYPE: 442 case JS_SET_TYPE:
443 return WriteJSSet(Handle<JSSet>::cast(receiver)); 443 return WriteJSSet(Handle<JSSet>::cast(receiver));
444 case JS_ARRAY_BUFFER_TYPE: 444 case JS_ARRAY_BUFFER_TYPE:
445 return WriteJSArrayBuffer(JSArrayBuffer::cast(*receiver)); 445 return WriteJSArrayBuffer(Handle<JSArrayBuffer>::cast(receiver));
446 case JS_TYPED_ARRAY_TYPE: 446 case JS_TYPED_ARRAY_TYPE:
447 case JS_DATA_VIEW_TYPE: 447 case JS_DATA_VIEW_TYPE:
448 return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver)); 448 return WriteJSArrayBufferView(JSArrayBufferView::cast(*receiver));
449 default: 449 default:
450 ThrowDataCloneError(MessageTemplate::kDataCloneError, receiver); 450 ThrowDataCloneError(MessageTemplate::kDataCloneError, receiver);
451 return Nothing<bool>(); 451 return Nothing<bool>();
452 } 452 }
453 return Nothing<bool>(); 453 return Nothing<bool>();
454 } 454 }
455 455
(...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after
717 for (int i = 0; i < length; i++) { 717 for (int i = 0; i < length; i++) {
718 if (!WriteObject(handle(entries->get(i), isolate_)).FromMaybe(false)) { 718 if (!WriteObject(handle(entries->get(i), isolate_)).FromMaybe(false)) {
719 return Nothing<bool>(); 719 return Nothing<bool>();
720 } 720 }
721 } 721 }
722 WriteTag(SerializationTag::kEndJSSet); 722 WriteTag(SerializationTag::kEndJSSet);
723 WriteVarint<uint32_t>(length); 723 WriteVarint<uint32_t>(length);
724 return Just(true); 724 return Just(true);
725 } 725 }
726 726
727 Maybe<bool> ValueSerializer::WriteJSArrayBuffer(JSArrayBuffer* array_buffer) { 727 Maybe<bool> ValueSerializer::WriteJSArrayBuffer(
728 Handle<JSArrayBuffer> array_buffer) {
728 uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer); 729 uint32_t* transfer_entry = array_buffer_transfer_map_.Find(array_buffer);
729 if (transfer_entry) { 730 if (array_buffer->is_shared()) {
730 WriteTag(array_buffer->is_shared() 731 if (!delegate_) {
731 ? SerializationTag::kSharedArrayBufferTransfer 732 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer);
732 : SerializationTag::kArrayBufferTransfer); 733 return Nothing<bool>();
733 WriteVarint(*transfer_entry); 734 }
735
736 if (transfer_entry) {
737 // SharedArrayBuffer must not be in the transfer list.
738 ThrowDataCloneError(
Jakob Kummerow 2016/12/13 02:34:58 Would it make more sense to enforce this with a DC
jbroman 2016/12/13 20:56:00 +1
binji 2016/12/14 23:58:30 Done.
739 MessageTemplate::kDataCloneErrorSharedArrayBufferTransferred);
740 return Nothing<bool>();
741 }
742
743 v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate_);
744 Maybe<uint32_t> index = delegate_->TransferSharedArrayBuffer(
745 v8_isolate, Utils::ToLocal(array_buffer));
746 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate_, Nothing<bool>());
747 DCHECK(!index.IsNothing());
748
749 WriteTag(SerializationTag::kSharedArrayBufferTransfer);
jbroman 2016/12/13 20:56:00 nit: Should this be renamed to just kSharedArrayBu
binji 2016/12/14 23:58:30 Done.
750 WriteVarint(index.FromJust());
734 return Just(true); 751 return Just(true);
735 } 752 } else {
jbroman 2016/12/13 20:56:00 nit: From my perspective, having to match this els
binji 2016/12/14 23:58:30 Done.
736 753 if (transfer_entry) {
737 if (array_buffer->is_shared()) { 754 WriteTag(SerializationTag::kArrayBufferTransfer);
738 ThrowDataCloneError( 755 WriteVarint(*transfer_entry);
739 MessageTemplate::kDataCloneErrorSharedArrayBufferNotTransferred); 756 return Just(true);
740 return Nothing<bool>(); 757 }
741 } 758 }
742 if (array_buffer->was_neutered()) { 759 if (array_buffer->was_neutered()) {
743 ThrowDataCloneError(MessageTemplate::kDataCloneErrorNeuteredArrayBuffer); 760 ThrowDataCloneError(MessageTemplate::kDataCloneErrorNeuteredArrayBuffer);
744 return Nothing<bool>(); 761 return Nothing<bool>();
745 } 762 }
746 double byte_length = array_buffer->byte_length()->Number(); 763 double byte_length = array_buffer->byte_length()->Number();
747 if (byte_length > std::numeric_limits<uint32_t>::max()) { 764 if (byte_length > std::numeric_limits<uint32_t>::max()) {
748 ThrowDataCloneError(MessageTemplate::kDataCloneError, handle(array_buffer)); 765 ThrowDataCloneError(MessageTemplate::kDataCloneError, array_buffer);
749 return Nothing<bool>(); 766 return Nothing<bool>();
750 } 767 }
751 WriteTag(SerializationTag::kArrayBuffer); 768 WriteTag(SerializationTag::kArrayBuffer);
752 WriteVarint<uint32_t>(byte_length); 769 WriteVarint<uint32_t>(byte_length);
753 WriteRawBytes(array_buffer->backing_store(), byte_length); 770 WriteRawBytes(array_buffer->backing_store(), byte_length);
754 return Just(true); 771 return Just(true);
755 } 772 }
756 773
757 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) { 774 Maybe<bool> ValueSerializer::WriteJSArrayBufferView(JSArrayBufferView* view) {
758 WriteTag(SerializationTag::kArrayBufferView); 775 WriteTag(SerializationTag::kArrayBufferView);
(...skipping 1101 matching lines...) Expand 10 before | Expand all | Expand 10 after
1860 if (stack.size() != 1) { 1877 if (stack.size() != 1) {
1861 isolate_->Throw(*isolate_->factory()->NewError( 1878 isolate_->Throw(*isolate_->factory()->NewError(
1862 MessageTemplate::kDataCloneDeserializationError)); 1879 MessageTemplate::kDataCloneDeserializationError));
1863 return MaybeHandle<Object>(); 1880 return MaybeHandle<Object>();
1864 } 1881 }
1865 return scope.CloseAndEscape(stack[0]); 1882 return scope.CloseAndEscape(stack[0]);
1866 } 1883 }
1867 1884
1868 } // namespace internal 1885 } // namespace internal
1869 } // namespace v8 1886 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698