Skip to content

Commit

Permalink
Merge pull request #497 from haberman/hasbit-bugfix
Browse files Browse the repository at this point in the history
Fixed data loss bug in the core
  • Loading branch information
haberman committed Jan 28, 2022
2 parents 85e5c76 + 31f7e2a commit 78a8346
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 3 deletions.
35 changes: 35 additions & 0 deletions tests/bindings/lua/test.proto
Expand Up @@ -32,3 +32,38 @@ message TestLargeFieldNumber {
message TestTimestamp {
optional google.protobuf.Timestamp ts = 1;
}

message HelloRequest {
optional uint32 id = 1;
optional uint32 random_name_a0 = 2;
optional uint32 random_name_a1 = 3;
optional uint32 random_name_a2 = 4;
optional uint32 random_name_a3 = 5;
optional uint32 random_name_a4 = 6;
optional uint32 random_name_a5 = 7;
optional uint32 random_name_a6 = 8;
optional uint32 random_name_a7 = 9;
optional uint32 random_name_a8 = 10;
optional uint32 random_name_a9 = 11;
optional uint32 random_name_b0 = 12;
optional uint32 random_name_b1 = 13;
optional uint32 random_name_b2 = 14;
optional uint32 random_name_b3 = 15;
optional uint32 random_name_b4 = 16;
optional uint32 random_name_b5 = 17;
optional uint32 random_name_b6 = 18;
optional uint32 random_name_b7 = 19;
optional uint32 random_name_b8 = 20;
optional uint32 random_name_b9 = 21;
optional uint32 random_name_c0 = 22;
optional uint32 random_name_c1 = 23;
optional uint32 random_name_c2 = 24;
optional uint32 random_name_c3 = 25;
optional uint32 random_name_c4 = 26;
optional uint32 random_name_c5 = 27;
optional uint32 random_name_c6 = 28;
optional uint32 random_name_c7 = 29;
optional uint32 random_name_c8 = 30;
optional uint32 random_name_c9 = 31;
optional string version = 32;
}
8 changes: 8 additions & 0 deletions tests/bindings/lua/test_upb.lua
Expand Up @@ -831,6 +831,14 @@ function test_gc()
end
end
function test_b9440()
local m = upb_test.HelloRequest()
m.id = 8
assert_equal(8, m.id)
m.version = "1"
assert_equal(8, m.id)
end
local stats = lunit.main()
if stats.failed > 0 or stats.errors > 0 then
Expand Down
35 changes: 35 additions & 0 deletions tests/test.proto
Expand Up @@ -11,3 +11,38 @@ message MessageName {
optional int32 field1 = 1;
optional int32 field2 = 2;
}

message HelloRequest {
optional uint32 id = 1;
optional uint32 random_name_a0 = 2;
optional uint32 random_name_a1 = 3;
optional uint32 random_name_a2 = 4;
optional uint32 random_name_a3 = 5;
optional uint32 random_name_a4 = 6;
optional uint32 random_name_a5 = 7;
optional uint32 random_name_a6 = 8;
optional uint32 random_name_a7 = 9;
optional uint32 random_name_a8 = 10;
optional uint32 random_name_a9 = 11;
optional uint32 random_name_b0 = 12;
optional uint32 random_name_b1 = 13;
optional uint32 random_name_b2 = 14;
optional uint32 random_name_b3 = 15;
optional uint32 random_name_b4 = 16;
optional uint32 random_name_b5 = 17;
optional uint32 random_name_b6 = 18;
optional uint32 random_name_b7 = 19;
optional uint32 random_name_b8 = 20;
optional uint32 random_name_b9 = 21;
optional uint32 random_name_c0 = 22;
optional uint32 random_name_c1 = 23;
optional uint32 random_name_c2 = 24;
optional uint32 random_name_c3 = 25;
optional uint32 random_name_c4 = 26;
optional uint32 random_name_c5 = 27;
optional uint32 random_name_c6 = 28;
optional uint32 random_name_c7 = 29;
optional uint32 random_name_c8 = 30;
optional uint32 random_name_c9 = 31;
optional string version = 32;
}
13 changes: 12 additions & 1 deletion tests/test_generated_code.cc
Expand Up @@ -30,9 +30,10 @@
* upb/def.c and tests/conformance_upb.c, respectively).
*/

#include "gtest/gtest.h"
#include "src/google/protobuf/test_messages_proto3.upb.h"
#include "tests/test.upb.h"
#include "gtest/gtest.h"
#include "upb/upb.hpp"

#define MIN(x, y) ((x) < (y) ? (x) : (y))

Expand Down Expand Up @@ -411,6 +412,16 @@ TEST(GeneratedCode, TestRepeated) {
upb_Arena_Free(arena);
}

TEST(GeneratedCode, Issue9440) {
upb::Arena arena;
upb_test_HelloRequest* msg = upb_test_HelloRequest_new(arena.ptr());
upb_test_HelloRequest_set_id(msg, 8);
EXPECT_EQ(8, upb_test_HelloRequest_id(msg));
char str[] = "1";
upb_test_HelloRequest_set_version(msg, upb_StringView{str, strlen(str)});
EXPECT_EQ(8, upb_test_HelloRequest_id(msg));
}

TEST(GeneratedCode, NullDecodeBuffer) {
upb_Arena* arena = upb_Arena_New();
protobuf_test_messages_proto3_TestAllTypesProto3* msg =
Expand Down
2 changes: 1 addition & 1 deletion upb/def.c
Expand Up @@ -1574,7 +1574,7 @@ static void make_layout(symtab_addctx* ctx, const upb_MessageDef* m) {
}

/* Account for space used by hasbits. */
l->size = div_round_up(hasbit, 8);
l->size = hasbit ? div_round_up(hasbit + 1, 8) : 0;

/* Allocate non-oneof fields. */
for (int i = 0; i < m->field_count; i++) {
Expand Down
2 changes: 1 addition & 1 deletion upbc/message_layout.cc
Expand Up @@ -190,7 +190,7 @@ void MessageLayout::PlaceNonOneofFields(
}

// Place hasbits at the beginning.
hasbit_bytes_ = DivRoundUp(hasbit_count_, 8);
hasbit_bytes_ = hasbit_count_ ? DivRoundUp(hasbit_count_ + 1, 8) : 0;
Place(SizeAndAlign{{hasbit_bytes_, hasbit_bytes_}, {1, 1}});

// Place non-oneof fields.
Expand Down

0 comments on commit 78a8346

Please sign in to comment.