aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/unknown_field_set.cc
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2018-09-07 16:15:38 -0700
committerGitHub <noreply@github.com>2018-09-07 16:15:38 -0700
commitf9d8138376765d229a32635c9209061e4e4aed8c (patch)
tree50719686fd7262f405c9bda8694d6c72e7c038b8 /src/google/protobuf/unknown_field_set.cc
parent2e7563f40ec7f901ae8ae1cc749d701fa07e211d (diff)
parente53be9bce4556cf0d13e24f1a25a7d75f663144f (diff)
downloadprotobuf-f9d8138376765d229a32635c9209061e4e4aed8c.tar.gz
protobuf-f9d8138376765d229a32635c9209061e4e4aed8c.tar.bz2
protobuf-f9d8138376765d229a32635c9209061e4e4aed8c.zip
Merge pull request #5109 from haberman/integrate
Down-integrate from google3.
Diffstat (limited to 'src/google/protobuf/unknown_field_set.cc')
-rw-r--r--src/google/protobuf/unknown_field_set.cc31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/google/protobuf/unknown_field_set.cc b/src/google/protobuf/unknown_field_set.cc
index dc53016b..0226c76b 100644
--- a/src/google/protobuf/unknown_field_set.cc
+++ b/src/google/protobuf/unknown_field_set.cc
@@ -329,6 +329,7 @@ const char* PackedValidEnumParser(const char* begin, const char* end,
while (ptr < end) {
uint64 varint;
ptr = Varint::Parse64(ptr, &varint);
+ GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
int val = varint;
if (ctx->extra_parse_data().ValidateEnum<UnknownFieldSet>(val))
repeated_field->Add(val);
@@ -343,6 +344,7 @@ const char* PackedValidEnumParserArg(const char* begin, const char* end,
while (ptr < end) {
uint64 varint;
ptr = Varint::Parse64(ptr, &varint);
+ GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
int val = varint;
if (ctx->extra_parse_data().ValidateEnumArg<UnknownFieldSet>(val))
repeated_field->Add(val);
@@ -358,7 +360,8 @@ const char* UnknownGroupParse(const char* begin, const char* end, void* object,
while (ptr < end) {
uint32 tag;
ptr = Varint::Parse32Inline(ptr, &tag);
- if ((tag >> 3) == 0) return nullptr;
+ GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+ GOOGLE_PROTOBUF_PARSER_ASSERT((tag >> 3) != 0);
auto res = UnknownFieldParse(tag, {UnknownGroupParse, unknown}, ptr, end,
unknown, ctx);
@@ -368,7 +371,7 @@ const char* UnknownGroupParse(const char* begin, const char* end, void* object,
return ptr;
}
-std::pair<const char*, bool> UnknownFieldParse(uint32 tag, ParseClosure parent,
+std::pair<const char*, bool> UnknownFieldParse(uint64 tag, ParseClosure parent,
const char* begin,
const char* end,
UnknownFieldSet* unknown,
@@ -378,14 +381,13 @@ std::pair<const char*, bool> UnknownFieldParse(uint32 tag, ParseClosure parent,
void* object;
auto ptr = begin;
- GOOGLE_DCHECK(tag >> 3);
-
uint32 field_num = tag >> 3;
+ GOOGLE_PROTOBUF_ASSERT_RETURN(field_num != 0, std::make_pair(nullptr, true));
switch (tag & 7) {
case 0: {
uint64 val;
ptr = Varint::Parse64(ptr, &val);
- if (!ptr) goto error;
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ptr, std::make_pair(nullptr, true));
unknown->AddVarint(field_num, val);
break;
}
@@ -397,26 +399,27 @@ std::pair<const char*, bool> UnknownFieldParse(uint32 tag, ParseClosure parent,
}
case 2: {
ptr = Varint::Parse32Inline(ptr, &size);
- if (!ptr) goto error;
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ptr, std::make_pair(nullptr, true));
object = unknown->AddLengthDelimited(field_num);
if (size > end - ptr) goto len_delim_till_end;
auto newend = ptr + size;
- if (!ctx->ParseExactRange({StringParser, object}, ptr, newend)) {
- goto error;
- }
+ bool ok = ctx->ParseExactRange({StringParser, object}, ptr, newend);
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ok, std::make_pair(nullptr, true));
ptr = newend;
break;
}
case 3: {
object = unknown->AddGroup(field_num);
- if (!ctx->PrepareGroup(tag, &depth)) goto error;
+ bool ok = ctx->PrepareGroup(tag, &depth);
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ok, std::make_pair(nullptr, true));
ptr = UnknownGroupParse(ptr, end, object, ctx);
- if (!ptr) goto error;
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ptr, std::make_pair(nullptr, true));
if (ctx->GroupContinues(depth)) goto group_continues;
break;
}
case 4: {
- if (!ctx->ValidEndGroup(tag)) goto error;
+ bool ok = ctx->ValidEndGroup(tag);
+ GOOGLE_PROTOBUF_ASSERT_RETURN(ok, std::make_pair(nullptr, true));
return std::make_pair(ptr, true);
}
case 5: {
@@ -426,11 +429,9 @@ std::pair<const char*, bool> UnknownFieldParse(uint32 tag, ParseClosure parent,
break;
}
default:
- goto error;
+ GOOGLE_PROTOBUF_ASSERT_RETURN(false, std::make_pair(nullptr, true));
}
return std::make_pair(ptr, false);
-error:
- return std::make_pair(nullptr, true);
len_delim_till_end:
// Length delimited field crosses end
return std::make_pair(