aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/google/protobuf/message.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/google/protobuf/message.cc')
-rw-r--r--src/google/protobuf/message.cc26
1 files changed, 22 insertions, 4 deletions
diff --git a/src/google/protobuf/message.cc b/src/google/protobuf/message.cc
index f6c932ff..097411cb 100644
--- a/src/google/protobuf/message.cc
+++ b/src/google/protobuf/message.cc
@@ -145,24 +145,42 @@ bool Message::ParsePartialFromZeroCopyStream(io::ZeroCopyInputStream* input) {
decoder.ConsumedEntireMessage();
}
+bool Message::ParseFromBoundedZeroCopyStream(
+ io::ZeroCopyInputStream* input, int size) {
+ io::CodedInputStream decoder(input);
+ decoder.PushLimit(size);
+ return ParseFromCodedStream(&decoder) &&
+ decoder.ConsumedEntireMessage() &&
+ decoder.BytesUntilLimit() == 0;
+}
+
+bool Message::ParsePartialFromBoundedZeroCopyStream(
+ io::ZeroCopyInputStream* input, int size) {
+ io::CodedInputStream decoder(input);
+ decoder.PushLimit(size);
+ return ParsePartialFromCodedStream(&decoder) &&
+ decoder.ConsumedEntireMessage() &&
+ decoder.BytesUntilLimit() == 0;
+}
+
bool Message::ParseFromString(const string& data) {
io::ArrayInputStream input(data.data(), data.size());
- return ParseFromZeroCopyStream(&input);
+ return ParseFromBoundedZeroCopyStream(&input, data.size());
}
bool Message::ParsePartialFromString(const string& data) {
io::ArrayInputStream input(data.data(), data.size());
- return ParsePartialFromZeroCopyStream(&input);
+ return ParsePartialFromBoundedZeroCopyStream(&input, data.size());
}
bool Message::ParseFromArray(const void* data, int size) {
io::ArrayInputStream input(data, size);
- return ParseFromZeroCopyStream(&input);
+ return ParseFromBoundedZeroCopyStream(&input, size);
}
bool Message::ParsePartialFromArray(const void* data, int size) {
io::ArrayInputStream input(data, size);
- return ParsePartialFromZeroCopyStream(&input);
+ return ParsePartialFromBoundedZeroCopyStream(&input, size);
}
bool Message::ParseFromFileDescriptor(int file_descriptor) {