From 62af9ef0f70d576fb07604bd7a51d32013837c0c Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Thu, 13 Aug 2020 19:56:23 -0700 Subject: [PATCH 1/2] Fix segment fault for proto3 optional Fixes #7801 --- src/google/protobuf/generated_message_reflection.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index 5483eda525a..315fa27812d 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -854,7 +854,7 @@ void Reflection::ClearField(Message* message, } case FieldDescriptor::CPPTYPE_MESSAGE: - if (!schema_.HasHasbits()) { + if (schema_.HasBitIndex() == -1) { // Proto3 does not have has-bits and we need to set a message field // to nullptr in order to indicate its un-presence. if (GetArena(message) == nullptr) { @@ -2048,6 +2048,7 @@ void Reflection::ClearBit(Message* message, return; } const uint32 index = schema_.HasBitIndex(field); + if (index == -1) return; MutableHasBits(message)[index / 32] &= ~(static_cast(1) << (index % 32)); } From ac6a066784c81f515460fe7a5d2031232706f148 Mon Sep 17 00:00:00 2001 From: Jie Luo Date: Thu, 13 Aug 2020 20:08:16 -0700 Subject: [PATCH 2/2] Update generated_message_reflection.cc --- src/google/protobuf/generated_message_reflection.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/google/protobuf/generated_message_reflection.cc b/src/google/protobuf/generated_message_reflection.cc index 315fa27812d..9fb62b902e4 100644 --- a/src/google/protobuf/generated_message_reflection.cc +++ b/src/google/protobuf/generated_message_reflection.cc @@ -854,7 +854,7 @@ void Reflection::ClearField(Message* message, } case FieldDescriptor::CPPTYPE_MESSAGE: - if (schema_.HasBitIndex() == -1) { + if (schema_.HasBitIndex(field) == -1) { // Proto3 does not have has-bits and we need to set a message field // to nullptr in order to indicate its un-presence. if (GetArena(message) == nullptr) {