Skip to content

Commit

Permalink
Fix Upb PromotoUnknownToMessage for OneOf fields.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 506738595
  • Loading branch information
protobuf-github-bot authored and Copybara-Service committed Feb 2, 2023
1 parent 067dfea commit 10e57c0
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 1 deletion.
10 changes: 9 additions & 1 deletion upb/message/accessors.c
Expand Up @@ -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"
Expand Down Expand Up @@ -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,
Expand All @@ -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 {
Expand Down Expand Up @@ -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;
}
Expand Down
2 changes: 2 additions & 0 deletions upb/message/accessors.h
Expand Up @@ -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,
Expand Down

0 comments on commit 10e57c0

Please sign in to comment.