Explorar o código

Fix segment fault for proto3 optional (#7805)

* Fix segment fault for proto3 optional

 Fixes #7801
Jie Luo %!s(int64=5) %!d(string=hai) anos
pai
achega
8a71927d74
Modificáronse 1 ficheiros con 2 adicións e 1 borrados
  1. 2 1
      src/google/protobuf/generated_message_reflection.cc

+ 2 - 1
src/google/protobuf/generated_message_reflection.cc

@@ -854,7 +854,7 @@ void Reflection::ClearField(Message* message,
         }
         }
 
 
         case FieldDescriptor::CPPTYPE_MESSAGE:
         case FieldDescriptor::CPPTYPE_MESSAGE:
-          if (!schema_.HasHasbits()) {
+          if (schema_.HasBitIndex(field) == -1) {
             // Proto3 does not have has-bits and we need to set a message field
             // Proto3 does not have has-bits and we need to set a message field
             // to nullptr in order to indicate its un-presence.
             // to nullptr in order to indicate its un-presence.
             if (GetArena(message) == nullptr) {
             if (GetArena(message) == nullptr) {
@@ -2048,6 +2048,7 @@ void Reflection::ClearBit(Message* message,
     return;
     return;
   }
   }
   const uint32 index = schema_.HasBitIndex(field);
   const uint32 index = schema_.HasBitIndex(field);
+  if (index == -1) return;
   MutableHasBits(message)[index / 32] &=
   MutableHasBits(message)[index / 32] &=
       ~(static_cast<uint32>(1) << (index % 32));
       ~(static_cast<uint32>(1) << (index % 32));
 }
 }