Skip to content

Commit eb301e1

Browse files
authored
Merge pull request #9450 from haberman/php-dataloss-bugfix
Fixed data loss bug in PHP C extension
2 parents 779b972 + 35a21c1 commit eb301e1

File tree

4 files changed

+50
-1
lines changed

4 files changed

+50
-1
lines changed

CHANGES.txt

Lines changed: 4 additions & 0 deletions
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+
PHP
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
2022-01-10 version 3.19.3 (C++/Java/Python/PHP/Objective-C/C#/Ruby/JavaScript)
711

812
Python

php/ext/google/protobuf/php-upb.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5968,7 +5968,7 @@ static void make_layout(symtab_addctx *ctx, const upb_msgdef *m) {
59685968
}
59695969

59705970
/* Account for space used by hasbits. */
5971-
l->size = div_round_up(hasbit, 8);
5971+
l->size = div_round_up(hasbit + 1, 8);
59725972

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

php/tests/GeneratedClassTest.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Bar\TestLegacyMessage;
1010
use Bar\TestLegacyMessage_NestedEnum;
1111
use Bar\TestLegacyMessage_NestedMessage;
12+
use Foo\Test32Fields;
1213
use Foo\TestEnum;
1314
use Foo\TestIncludeNamespaceMessage;
1415
use Foo\TestIncludePrefixMessage;
@@ -1849,4 +1850,13 @@ public function testNoExceptionWithVarDump()
18491850

18501851
$this->assertTrue(true);
18511852
}
1853+
1854+
public function testIssue9440()
1855+
{
1856+
$m = new Test32Fields();
1857+
$m->setId(8);
1858+
$this->assertEquals(8, $m->getId());
1859+
$m->setVersion('1');
1860+
$this->assertEquals(8, $m->getId());
1861+
}
18521862
}

php/tests/proto/test.proto

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,3 +306,38 @@ message TestBytesValue {
306306
int32 int32_field = 4;
307307
}
308308
}
309+
310+
message Test32Fields {
311+
optional uint32 id = 1;
312+
optional uint32 random_name_a0 = 2;
313+
optional uint32 random_name_a1 = 3;
314+
optional uint32 random_name_a2 = 4;
315+
optional uint32 random_name_a3 = 5;
316+
optional uint32 random_name_a4 = 6;
317+
optional uint32 random_name_a5 = 7;
318+
optional uint32 random_name_a6 = 8;
319+
optional uint32 random_name_a7 = 9;
320+
optional uint32 random_name_a8 = 10;
321+
optional uint32 random_name_a9 = 11;
322+
optional uint32 random_name_b0 = 12;
323+
optional uint32 random_name_b1 = 13;
324+
optional uint32 random_name_b2 = 14;
325+
optional uint32 random_name_b3 = 15;
326+
optional uint32 random_name_b4 = 16;
327+
optional uint32 random_name_b5 = 17;
328+
optional uint32 random_name_b6 = 18;
329+
optional uint32 random_name_b7 = 19;
330+
optional uint32 random_name_b8 = 20;
331+
optional uint32 random_name_b9 = 21;
332+
optional uint32 random_name_c0 = 22;
333+
optional uint32 random_name_c1 = 23;
334+
optional uint32 random_name_c2 = 24;
335+
optional uint32 random_name_c3 = 25;
336+
optional uint32 random_name_c4 = 26;
337+
optional uint32 random_name_c5 = 27;
338+
optional uint32 random_name_c6 = 28;
339+
optional uint32 random_name_c7 = 29;
340+
optional uint32 random_name_c8 = 30;
341+
optional uint32 random_name_c9 = 31;
342+
optional string version = 32;
343+
}

0 commit comments

Comments
 (0)