Tighten up size calculation for flexible array members PiperOrigin-RevId: 697036283
diff --git a/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs b/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs deleted file mode 100644 index 208ce1f..0000000 --- a/csharp/src/Google.Protobuf/Reflection/FeatureSetDescriptor.g.cs +++ /dev/null
@@ -1,17 +0,0 @@ -#region Copyright notice and license -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file or at -// https://developers.google.com/open-source/licenses/bsd -#endregion - -namespace Google.Protobuf.Reflection; - -internal sealed partial class FeatureSetDescriptor -{ - // Canonical serialized form of the edition defaults, generated by embed_edition_defaults. - private const string DefaultsBase64 = - "ChMYhAciACoMCAEQAhgCIAMoATACChMY5wciACoMCAIQARgBIAIoATABChMY6AciDAgBEAEYASACKAEwASoAIOYHKOgH"; -}
diff --git a/upb/mini_descriptor/build_enum.c b/upb/mini_descriptor/build_enum.c index 485fee2..e368ffe 100644 --- a/upb/mini_descriptor/build_enum.c +++ b/upb/mini_descriptor/build_enum.c
@@ -31,7 +31,7 @@ } upb_MdEnumDecoder; static size_t upb_MiniTableEnum_Size(size_t count) { - return sizeof(upb_MiniTableEnum) + count * sizeof(uint32_t); + return UPB_SIZEOF_FLEX(upb_MiniTableEnum, UPB_PRIVATE(data), count); } static upb_MiniTableEnum* _upb_MiniTable_AddEnumDataMember(upb_MdEnumDecoder* d,
diff --git a/upb/port/def.inc b/upb/port/def.inc index 383d0cd..6e6b49c 100644 --- a/upb/port/def.inc +++ b/upb/port/def.inc
@@ -64,6 +64,15 @@ */ #define UPB_PTR_AT(msg, ofs, type) ((type*)((char*)(msg) + (ofs))) +// A flexible array member may have lower alignment requirements than the struct +// overall - in that case, it can overlap with the trailing padding of the rest +// of the struct, and a naive sizeof(base) + sizeof(flex) * count calculation +// will not take into account that overlap, and allocate more than is required. +#define UPB_SIZEOF_FLEX(type, member, count) \ + (UPB_MAX(sizeof(type), \ + (offsetof(type, member) + \ + count * (offsetof(type, member[1]) - offsetof(type, member[0]))))) + #define UPB_MAPTYPE_STRING 0 // UPB_EXPORT: always generate a public symbol.
diff --git a/upb/port/undef.inc b/upb/port/undef.inc index f94e276..e8df37a 100644 --- a/upb/port/undef.inc +++ b/upb/port/undef.inc
@@ -9,6 +9,7 @@ #undef UPB_SIZE #undef UPB_PTR_AT +#undef UPB_SIZEOF_FLEX #undef UPB_MAPTYPE_STRING #undef UPB_EXPORT #undef UPB_INLINE