Skip to content

Commit 70b77de

Browse files
protobuf-github-botzhangskz
authored andcommitted
Fix a potential Ruby-upb use of uninitialized memory.
Introduce a upb_MessageValue_Zero() function to use for the cases we do want a zero'd union (typically a zero MessageValue union is not needed) PiperOrigin-RevId: 672592274
1 parent 5b4b3af commit 70b77de

File tree

4 files changed

+28
-5
lines changed

4 files changed

+28
-5
lines changed

ruby/ext/google/protobuf_c/defs.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -726,7 +726,7 @@ static VALUE FieldDescriptor__type(VALUE _self) {
726726
static VALUE FieldDescriptor_default(VALUE _self) {
727727
FieldDescriptor* self = ruby_to_FieldDescriptor(_self);
728728
const upb_FieldDef* f = self->fielddef;
729-
upb_MessageValue default_val = {0};
729+
upb_MessageValue default_val = upb_MessageValue_Zero();
730730
if (upb_FieldDef_IsSubMessage(f)) {
731731
return Qnil;
732732
} else if (!upb_FieldDef_IsRepeated(f)) {

upb/json/decode.c

-2
Original file line numberDiff line numberDiff line change
@@ -712,7 +712,6 @@ static upb_MessageValue jsondec_int(jsondec* d, const upb_FieldDef* f) {
712712
/* Parse UINT32 or UINT64 value. */
713713
static upb_MessageValue jsondec_uint(jsondec* d, const upb_FieldDef* f) {
714714
upb_MessageValue val;
715-
memset(&val, 0, sizeof(val));
716715

717716
switch (jsondec_peek(d)) {
718717
case JD_NUMBER: {
@@ -750,7 +749,6 @@ static upb_MessageValue jsondec_uint(jsondec* d, const upb_FieldDef* f) {
750749
static upb_MessageValue jsondec_double(jsondec* d, const upb_FieldDef* f) {
751750
upb_StringView str;
752751
upb_MessageValue val;
753-
memset(&val, 0, sizeof(val));
754752

755753
switch (jsondec_peek(d)) {
756754
case JD_NUMBER:

upb/message/value.h

+26
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,17 @@
1212
#define UPB_MESSAGE_VALUE_H_
1313

1414
#include <stdint.h>
15+
#include <string.h>
1516

1617
#include "upb/base/string_view.h"
1718

19+
// Must be last.
20+
#include "upb/port/def.inc"
21+
22+
#ifdef __cplusplus
23+
extern "C" {
24+
#endif
25+
1826
typedef union {
1927
bool bool_val;
2028
float float_val;
@@ -35,10 +43,28 @@ typedef union {
3543
uintptr_t tagged_msg_val; // upb_TaggedMessagePtr
3644
} upb_MessageValue;
3745

46+
UPB_API_INLINE upb_MessageValue upb_MessageValue_Zero(void) {
47+
upb_MessageValue zero;
48+
memset(&zero, 0, sizeof(zero));
49+
return zero;
50+
}
51+
3852
typedef union {
3953
struct upb_Array* array;
4054
struct upb_Map* map;
4155
struct upb_Message* msg;
4256
} upb_MutableMessageValue;
4357

58+
UPB_API_INLINE upb_MutableMessageValue upb_MutableMessageValue_Zero(void) {
59+
upb_MutableMessageValue zero;
60+
memset(&zero, 0, sizeof(zero));
61+
return zero;
62+
}
63+
64+
#ifdef __cplusplus
65+
} /* extern "C" */
66+
#endif
67+
68+
#include "upb/port/undef.inc"
69+
4470
#endif /* UPB_MESSAGE_VALUE_H_ */

upb/reflection/message.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,7 @@ bool upb_Message_Next(const upb_Message* msg, const upb_MessageDef* m,
138138
const upb_MiniTable* mt = upb_MessageDef_MiniTable(m);
139139
size_t i = *iter;
140140
size_t n = upb_MiniTable_FieldCount(mt);
141-
upb_MessageValue zero;
142-
memset(&zero, 0, sizeof(zero));
141+
upb_MessageValue zero = upb_MessageValue_Zero();
143142
UPB_UNUSED(ext_pool);
144143

145144
// Iterate over normal fields, returning the first one that is set.

0 commit comments

Comments
 (0)