| OLD | NEW |
| (Empty) |
| 1 diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.c
c b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc | |
| 2 index 9baaa35..0917537 100644 | |
| 3 --- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc | |
| 4 +++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message.cc | |
| 5 @@ -2372,8 +2372,16 @@ GenerateClear(io::Printer* printer) { | |
| 6 // positions of two fields in the Message. | |
| 7 // ZR_ zeroes a non-empty range of fields via memset. | |
| 8 const char* macros = | |
| 9 + "#if defined(__clang__)\n" | |
| 10 + "#define ZR_HELPER_(f) \\\n" | |
| 11 + " _Pragma(\"clang diagnostic push\") \\\n" | |
| 12 + " _Pragma(\"clang diagnostic ignored \\\"-Winvalid-offsetof\\\"\") \\\n" | |
| 13 + " __builtin_offsetof($classname$, f) \\\n" | |
| 14 + " _Pragma(\"clang diagnostic pop\")\n" | |
| 15 + "#else\n" | |
| 16 "#define ZR_HELPER_(f) reinterpret_cast<char*>(\\\n" | |
| 17 - " &reinterpret_cast<$classname$*>(16)->f)\n\n" | |
| 18 + " &reinterpret_cast<$classname$*>(16)->f)\n" | |
| 19 + "#endif\n\n" | |
| 20 "#define ZR_(first, last) do {\\\n" | |
| 21 " ::memset(&first, 0,\\\n" | |
| 22 " ZR_HELPER_(last) - ZR_HELPER_(first) + sizeof(last));\\\n" | |
| 23 diff --git a/third_party/protobuf/src/google/protobuf/generated_message_reflecti
on.h b/third_party/protobuf/src/google/protobuf/generated_message_reflection.h | |
| 24 index 9ef7871..b26bbbc 100644 | |
| 25 --- a/third_party/protobuf/src/google/protobuf/generated_message_reflection.h | |
| 26 +++ b/third_party/protobuf/src/google/protobuf/generated_message_reflection.h | |
| 27 @@ -587,11 +587,22 @@ class LIBPROTOBUF_EXPORT GeneratedMessageReflection : publ
ic Reflection { | |
| 28 // just use zero, GCC complains about dereferencing a NULL pointer. We | |
| 29 // choose 16 rather than some other number just in case the compiler would | |
| 30 // be confused by an unaligned pointer. | |
| 31 +#if defined(__clang__) | |
| 32 +// For Clang we use __builtin_offsetof() and suppress the warning, | |
| 33 +// to avoid Control Flow Integrity and UBSan vptr sanitizers from | |
| 34 +// crashing while trying to validate the invalid reinterpet_casts. | |
| 35 +#define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ | |
| 36 + _Pragma("clang diagnostic push") \ | |
| 37 + _Pragma("clang diagnostic ignored \"-Winvalid-offsetof\"") \ | |
| 38 + __builtin_offsetof(TYPE, FIELD) \ | |
| 39 + _Pragma("clang diagnostic pop") | |
| 40 +#else | |
| 41 #define GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(TYPE, FIELD) \ | |
| 42 static_cast<int>( \ | |
| 43 reinterpret_cast<const char*>( \ | |
| 44 &reinterpret_cast<const TYPE*>(16)->FIELD) - \ | |
| 45 reinterpret_cast<const char*>(16)) | |
| 46 +#endif | |
| 47 | |
| 48 #define PROTO2_GENERATED_DEFAULT_ONEOF_FIELD_OFFSET(ONEOF, FIELD) \ | |
| 49 static_cast<int>( \ | |
| OLD | NEW |