diff options
author | rsgowman <rgowman@google.com> | 2018-06-04 15:31:10 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-06-04 15:31:10 -0400 |
commit | 26b8ac9ee43bb67b08e4bc62af98ac6bda2f121c (patch) | |
tree | bf6b194b8a4a6247247a22b701a65e2be1eaf723 /Firestore/core/src/firebase/firestore/remote | |
parent | a135ee17175f8f186e73252263b8dbc3785f3d3c (diff) |
Skip unknown fields while decoding FieldValue proto objects. (#1354)
Diffstat (limited to 'Firestore/core/src/firebase/firestore/remote')
-rw-r--r-- | Firestore/core/src/firebase/firestore/remote/serializer.cc | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/Firestore/core/src/firebase/firestore/remote/serializer.cc b/Firestore/core/src/firebase/firestore/remote/serializer.cc index 0839efc..eee56f8 100644 --- a/Firestore/core/src/firebase/firestore/remote/serializer.cc +++ b/Firestore/core/src/firebase/firestore/remote/serializer.cc @@ -204,20 +204,20 @@ FieldValue DecodeFieldValueImpl(Reader* reader) { } break; - default: - // We could get here for one of two reasons; either because the input - // bytes are corrupt, or because we're attempting to parse a tag that we - // haven't implemented yet. Long term, the latter reason should become - // less likely (especially in production), so we'll assume former. - - // TODO(rsgowman): While still in development, we'll contradict the - // above and assume the latter. Remove the following assertion when - // we're confident that we're handling all the tags in the protos. + case google_firestore_v1beta1_Value_double_value_tag: + case google_firestore_v1beta1_Value_bytes_value_tag: + case google_firestore_v1beta1_Value_reference_value_tag: + case google_firestore_v1beta1_Value_geo_point_value_tag: + case google_firestore_v1beta1_Value_array_value_tag: + // TODO(b/74243929): Implement remaining types. HARD_FAIL("Unhandled message field number (tag): %i.", tag.field_number); - reader->set_status(Status( - FirestoreErrorCode::DataLoss, - "Input proto bytes cannot be parsed (invalid field number (tag))")); + + default: + // Unknown tag. According to the proto spec, we need to ignore these. No + // action required here, though we'll need to skip the relevant bytes + // below. + break; } if (!reader->status().ok()) return FieldValue::NullValue(); @@ -247,12 +247,18 @@ FieldValue DecodeFieldValueImpl(Reader* reader) { reader->ReadNestedMessage<ObjectValue::Map>(DecodeMapValue)); break; + case google_firestore_v1beta1_Value_double_value_tag: + case google_firestore_v1beta1_Value_bytes_value_tag: + case google_firestore_v1beta1_Value_reference_value_tag: + case google_firestore_v1beta1_Value_geo_point_value_tag: + case google_firestore_v1beta1_Value_array_value_tag: + // TODO(b/74243929): Implement remaining types. + HARD_FAIL("Unhandled message field number (tag): %i.", + tag.field_number); + default: - // This indicates an internal error as we've already ensured that this - // is a valid field_number. - HARD_FAIL( - "Somehow got an unexpected field number (tag) after verifying that " - "the field number was expected."); + // Unknown tag. According to the proto spec, we need to ignore these. + reader->SkipField(tag); } } |