Index: third_party/protobuf/src/google/protobuf/message_lite.cc |
diff --git a/third_party/protobuf/src/google/protobuf/message_lite.cc b/third_party/protobuf/src/google/protobuf/message_lite.cc |
index 9d7b64f7472cb24a915d81df7368869026c872b4..a42e9ec3121833821a81dab47d1cc5ae63ea02c3 100644 |
--- a/third_party/protobuf/src/google/protobuf/message_lite.cc |
+++ b/third_party/protobuf/src/google/protobuf/message_lite.cc |
@@ -33,8 +33,11 @@ |
// Based on original Protocol Buffers design by |
// Sanjay Ghemawat, Jeff Dean, and others. |
-#include <google/protobuf/message_lite.h> |
+#include <climits> |
+ |
#include <google/protobuf/arena.h> |
+#include <google/protobuf/generated_message_util.h> |
+#include <google/protobuf/message_lite.h> |
#include <google/protobuf/repeated_field.h> |
#include <string> |
#include <google/protobuf/stubs/logging.h> |
@@ -46,8 +49,6 @@ |
namespace google { |
namespace protobuf { |
-MessageLite::~MessageLite() {} |
- |
string MessageLite::InitializationErrorString() const { |
return "(cannot determine missing fields for lite message)"; |
} |
@@ -60,9 +61,9 @@ namespace { |
// protobuf implementation but is more likely caused by concurrent modification |
// of the message. This function attempts to distinguish between the two and |
// provide a useful error message. |
-void ByteSizeConsistencyError(int byte_size_before_serialization, |
- int byte_size_after_serialization, |
- int bytes_produced_by_serialization, |
+void ByteSizeConsistencyError(size_t byte_size_before_serialization, |
+ size_t byte_size_after_serialization, |
+ size_t bytes_produced_by_serialization, |
const MessageLite& message) { |
GOOGLE_CHECK_EQ(byte_size_before_serialization, byte_size_after_serialization) |
<< message.GetTypeName() |
@@ -221,7 +222,8 @@ bool MessageLite::ParsePartialFromArray(const void* data, int size) { |
// =================================================================== |
-uint8* MessageLite::SerializeWithCachedSizesToArray(uint8* target) const { |
+uint8* MessageLite::InternalSerializeWithCachedSizesToArray( |
+ bool deterministic, uint8* target) const { |
// We only optimize this when using optimize_for = SPEED. In other cases |
// we just use the CodedOutputStream path. |
int size = GetCachedSize(); |
@@ -239,18 +241,18 @@ bool MessageLite::SerializeToCodedStream(io::CodedOutputStream* output) const { |
bool MessageLite::SerializePartialToCodedStream( |
io::CodedOutputStream* output) const { |
- const int size = ByteSize(); // Force size to be cached. |
- if (size < 0) { |
- // Messages >2G cannot be serialized due to overflow computing ByteSize. |
- GOOGLE_LOG(ERROR) << "Error computing ByteSize (possible overflow?)."; |
+ const size_t size = ByteSizeLong(); // Force size to be cached. |
+ if (size > INT_MAX) { |
+ GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << size; |
return false; |
} |
uint8* buffer = output->GetDirectBufferForNBytesAndAdvance(size); |
if (buffer != NULL) { |
- uint8* end = SerializeWithCachedSizesToArray(buffer); |
+ uint8* end = InternalSerializeWithCachedSizesToArray( |
+ output->IsSerializationDeterministic(), buffer); |
if (end - buffer != size) { |
- ByteSizeConsistencyError(size, ByteSize(), end - buffer, *this); |
+ ByteSizeConsistencyError(size, ByteSizeLong(), end - buffer, *this); |
} |
return true; |
} else { |
@@ -262,7 +264,7 @@ bool MessageLite::SerializePartialToCodedStream( |
int final_byte_count = output->ByteCount(); |
if (final_byte_count - original_byte_count != size) { |
- ByteSizeConsistencyError(size, ByteSize(), |
+ ByteSizeConsistencyError(size, ByteSizeLong(), |
final_byte_count - original_byte_count, *this); |
} |
@@ -288,11 +290,10 @@ bool MessageLite::AppendToString(string* output) const { |
} |
bool MessageLite::AppendPartialToString(string* output) const { |
- int old_size = output->size(); |
- int byte_size = ByteSize(); |
- if (byte_size < 0) { |
- // Messages >2G cannot be serialized due to overflow computing ByteSize. |
- GOOGLE_LOG(ERROR) << "Error computing ByteSize (possible overflow?)."; |
+ size_t old_size = output->size(); |
+ size_t byte_size = ByteSizeLong(); |
+ if (byte_size > INT_MAX) { |
+ GOOGLE_LOG(ERROR) << "Exceeded maximum protobuf size of 2GB: " << byte_size; |
return false; |
} |
@@ -301,7 +302,7 @@ bool MessageLite::AppendPartialToString(string* output) const { |
reinterpret_cast<uint8*>(io::mutable_string_data(output) + old_size); |
uint8* end = SerializeWithCachedSizesToArray(start); |
if (end - start != byte_size) { |
- ByteSizeConsistencyError(byte_size, ByteSize(), end - start, *this); |
+ ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this); |
} |
return true; |
} |
@@ -322,12 +323,12 @@ bool MessageLite::SerializeToArray(void* data, int size) const { |
} |
bool MessageLite::SerializePartialToArray(void* data, int size) const { |
- int byte_size = ByteSize(); |
+ int byte_size = ByteSizeLong(); |
if (size < byte_size) return false; |
uint8* start = reinterpret_cast<uint8*>(data); |
uint8* end = SerializeWithCachedSizesToArray(start); |
if (end - start != byte_size) { |
- ByteSizeConsistencyError(byte_size, ByteSize(), end - start, *this); |
+ ByteSizeConsistencyError(byte_size, ByteSizeLong(), end - start, *this); |
} |
return true; |
} |