Skip to content

Commit f27532d

Browse files
Check that there are unknown fields before calling MutableUnknownFields to
clear it. Otherwise, we end up creating the unknown field set just to call Clear on it, which wastes memory. PiperOrigin-RevId: 691844650
1 parent e406a1a commit f27532d

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

src/google/protobuf/reflection_ops.cc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "google/protobuf/descriptor.pb.h"
2121
#include "google/protobuf/map_field.h"
2222
#include "google/protobuf/map_field_inl.h"
23+
#include "google/protobuf/port.h"
2324
#include "google/protobuf/unknown_field_set.h"
2425

2526
// Must be included last.
@@ -320,7 +321,9 @@ static bool IsMapValueMessageTyped(const FieldDescriptor* map_field) {
320321
void ReflectionOps::DiscardUnknownFields(Message* message) {
321322
const Reflection* reflection = GetReflectionOrDie(*message);
322323

323-
reflection->MutableUnknownFields(message)->Clear();
324+
if (reflection->GetUnknownFields(*message).field_count() != 0) {
325+
reflection->MutableUnknownFields(message)->Clear();
326+
}
324327

325328
// Walk through the fields of this message and DiscardUnknownFields on any
326329
// messages present.

src/google/protobuf/reflection_ops_unittest.cc

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,15 @@ TEST(ReflectionOpsTest, DiscardUnknownFields) {
274274
message.repeated_nested_message(0).unknown_fields().field_count());
275275
}
276276

277+
TEST(ReflectionOpsTest, DiscardUnknownFieldsIsANoopIfNotPresent) {
278+
unittest::TestAllTypes message;
279+
EXPECT_EQ(&message.unknown_fields(),
280+
&google::protobuf::UnknownFieldSet::default_instance());
281+
ReflectionOps::DiscardUnknownFields(&message);
282+
EXPECT_EQ(&message.unknown_fields(),
283+
&google::protobuf::UnknownFieldSet::default_instance());
284+
}
285+
277286
TEST(ReflectionOpsTest, DiscardUnknownExtensions) {
278287
unittest::TestAllExtensions message;
279288
TestUtil::SetAllExtensions(&message);

0 commit comments

Comments
 (0)