Skip to content

Commit afeb6d8

Browse files
authored
Merge pull request protocolbuffers#9451 from haberman/ruby-dataloss-bugfix
Fixed data loss bug in Ruby extension
2 parents eb301e1 + 98b8e05 commit afeb6d8

File tree

4 files changed

+48
-1
lines changed

4 files changed

+48
-1
lines changed

CHANGES.txt

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
Python
44
* Make libprotobuf symbols local on OSX to fix issue #9395 (#9435)
55

6+
Ruby
7+
* Fixed a data loss bug that could occur when the number of `optional`
8+
fields in a message is an exact multiple of 32. (#9440).
9+
610
PHP
711
* Fixed a data loss bug that could occur when the number of `optional`
812
fields in a message is an exact multiple of 32. (#9440).

ruby/ext/google/protobuf_c/ruby-upb.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -5583,7 +5583,7 @@ static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
55835583
}
55845584

55855585
/* Account for space used by hasbits. */
5586-
l->size = div_round_up(hasbit, 8);
5586+
l->size = div_round_up(hasbit + 1, 8);
55875587

55885588
/* Allocate non-oneof fields. */
55895589
for (upb_msg_field_begin(&it, m); !upb_msg_field_done(&it);

ruby/tests/basic.rb

+8
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,14 @@ def test_issue_8559_crash
7171
TestMessage.encode(msg)
7272
end
7373

74+
def test_issue_9440
75+
msg = HelloRequest.new
76+
msg.id = 8
77+
assert_equal 8, msg.id
78+
msg.version = '1'
79+
assert_equal 8, msg.id
80+
end
81+
7482
def test_has_field
7583
m = TestSingularFields.new
7684
assert !m.has_singular_msg?

ruby/tests/basic_test.proto

+35
Original file line numberDiff line numberDiff line change
@@ -215,3 +215,38 @@ message WithJsonName {
215215
optional int32 foo_bar = 1 [json_name="jsonFooBar"];
216216
repeated WithJsonName baz = 2 [json_name="jsonBaz"];
217217
}
218+
219+
message HelloRequest {
220+
optional uint32 id = 1;
221+
optional uint32 random_name_a0 = 2;
222+
optional uint32 random_name_a1 = 3;
223+
optional uint32 random_name_a2 = 4;
224+
optional uint32 random_name_a3 = 5;
225+
optional uint32 random_name_a4 = 6;
226+
optional uint32 random_name_a5 = 7;
227+
optional uint32 random_name_a6 = 8;
228+
optional uint32 random_name_a7 = 9;
229+
optional uint32 random_name_a8 = 10;
230+
optional uint32 random_name_a9 = 11;
231+
optional uint32 random_name_b0 = 12;
232+
optional uint32 random_name_b1 = 13;
233+
optional uint32 random_name_b2 = 14;
234+
optional uint32 random_name_b3 = 15;
235+
optional uint32 random_name_b4 = 16;
236+
optional uint32 random_name_b5 = 17;
237+
optional uint32 random_name_b6 = 18;
238+
optional uint32 random_name_b7 = 19;
239+
optional uint32 random_name_b8 = 20;
240+
optional uint32 random_name_b9 = 21;
241+
optional uint32 random_name_c0 = 22;
242+
optional uint32 random_name_c1 = 23;
243+
optional uint32 random_name_c2 = 24;
244+
optional uint32 random_name_c3 = 25;
245+
optional uint32 random_name_c4 = 26;
246+
optional uint32 random_name_c5 = 27;
247+
optional uint32 random_name_c6 = 28;
248+
optional uint32 random_name_c7 = 29;
249+
optional uint32 random_name_c8 = 30;
250+
optional uint32 random_name_c9 = 31;
251+
optional string version = 32;
252+
}

0 commit comments

Comments
 (0)