From 10e57c038aef9154a4ddc03b627c4e5cbef9da04 Mon Sep 17 00:00:00 2001 From: Protobuf Team Bot Date: Thu, 2 Feb 2023 15:27:17 -0800 Subject: [PATCH] Fix Upb PromotoUnknownToMessage for OneOf fields. PiperOrigin-RevId: 506738595 --- upb/message/accessors.c | 10 +++++++++- upb/message/accessors.h | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/upb/message/accessors.c b/upb/message/accessors.c index 43848040a7..2ed872a774 100644 --- a/upb/message/accessors.c +++ b/upb/message/accessors.c @@ -31,6 +31,7 @@ #include "upb/collections/array_internal.h" #include "upb/collections/map.h" #include "upb/message/message.h" +#include "upb/mini_table/field_internal.h" #include "upb/wire/decode.h" #include "upb/wire/encode.h" #include "upb/wire/eps_copy_input_stream.h" @@ -185,6 +186,7 @@ upb_FindUnknownRet upb_MiniTable_FindUnknown(const upb_Message* msg, return ret; } +// Warning: See TODO(b/267655898) upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table, @@ -195,7 +197,10 @@ upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( // Callers should check that message is not set first before calling // PromotoUnknownToMessage. UPB_ASSERT(mini_table->subs[field->submsg_index].submsg == sub_mini_table); - UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + bool is_oneof = _upb_MiniTableField_InOneOf(field); + if (!is_oneof || _upb_getoneofcase_field(msg, field) == field->number) { + UPB_ASSERT(upb_Message_GetMessage(msg, field, NULL) == NULL); + } upb_UnknownToMessageRet ret; ret.status = kUpb_UnknownToMessage_Ok; do { @@ -223,6 +228,9 @@ upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( } } while (unknown.status == kUpb_FindUnknown_Ok); if (message) { + if (is_oneof) { + *_upb_oneofcase_field(msg, field) = field->number; + } upb_Message_SetMessage(msg, mini_table, field, message); ret.message = message; } diff --git a/upb/message/accessors.h b/upb/message/accessors.h index 5772c97ae7..36b5835998 100644 --- a/upb/message/accessors.h +++ b/upb/message/accessors.h @@ -722,6 +722,8 @@ typedef struct { // // The unknown data is removed from message after field value is set // using upb_Message_SetMessage. +// +// WARNING!: See b/267655898 upb_UnknownToMessageRet upb_MiniTable_PromoteUnknownToMessage( upb_Message* msg, const upb_MiniTable* mini_table, const upb_MiniTableField* field, const upb_MiniTable* sub_mini_table,