Index: src/value-serializer.cc |
diff --git a/src/value-serializer.cc b/src/value-serializer.cc |
index c757650d04f44cb0d0b0b3f657b007e929001d3e..effbe3f0b68e2fc6a60d191b4e94a57a29e85d0c 100644 |
--- a/src/value-serializer.cc |
+++ b/src/value-serializer.cc |
@@ -1136,8 +1136,9 @@ MaybeHandle<String> ValueDeserializer::ReadUtf8String() { |
if (!ReadVarint<uint32_t>().To(&utf8_length) || |
utf8_length > |
static_cast<uint32_t>(std::numeric_limits<int32_t>::max()) || |
- !ReadRawBytes(utf8_length).To(&utf8_bytes)) |
+ !ReadRawBytes(utf8_length).To(&utf8_bytes)) { |
return MaybeHandle<String>(); |
+ } |
return isolate_->factory()->NewStringFromUtf8( |
Vector<const char>::cast(utf8_bytes), pretenure_); |
} |
@@ -1148,16 +1149,20 @@ MaybeHandle<String> ValueDeserializer::ReadTwoByteString() { |
if (!ReadVarint<uint32_t>().To(&byte_length) || |
byte_length > |
static_cast<uint32_t>(std::numeric_limits<int32_t>::max()) || |
- byte_length % sizeof(uc16) != 0 || !ReadRawBytes(byte_length).To(&bytes)) |
+ byte_length % sizeof(uc16) != 0 || |
+ !ReadRawBytes(byte_length).To(&bytes)) { |
return MaybeHandle<String>(); |
+ } |
// Allocate an uninitialized string so that we can do a raw memcpy into the |
// string on the heap (regardless of alignment). |
+ if (byte_length == 0) return isolate_->factory()->empty_string(); |
Handle<SeqTwoByteString> string; |
if (!isolate_->factory() |
->NewRawTwoByteString(byte_length / sizeof(uc16), pretenure_) |
- .ToHandle(&string)) |
+ .ToHandle(&string)) { |
return MaybeHandle<String>(); |
+ } |
// Copy the bytes directly into the new string. |
// Warning: this uses host endianness. |