+2
-59
lines changedFilter options
+2
-59
lines changed Original file line number Diff line number Diff line change
@@ -65,7 +65,6 @@ static zend_object* Message_create(zend_class_entry* class_type) {
65
65
Message_SuppressDefaultProperties(class_type);
66
66
zend_object_std_init(&intern->std, class_type);
67
67
intern->std.handlers = &message_object_handlers;
68
-
intern->desc = NULL;
69
68
Arena_Init(&intern->arena);
70
69
return &intern->std;
71
70
}
@@ -90,15 +89,6 @@ static void Message_dtor(zend_object* obj) {
90
89
* Helper function to look up a field given a member name (as a string).
91
90
*/
92
91
static const upb_FieldDef* get_field(Message* msg, zend_string* member) {
93
-
if (!msg || !msg->desc || !msg->desc->msgdef) {
94
-
zend_throw_exception_ex(NULL, 0,
95
-
"Couldn't find descriptor. "
96
-
"The message constructor was likely bypassed, "
97
-
"resulting in an uninitialized descriptor.");
98
-
99
-
return NULL;
100
-
}
101
-
102
92
const upb_MessageDef* m = msg->desc->msgdef;
103
93
const upb_FieldDef* f = upb_MessageDef_FindFieldByNameWithSize(
104
94
m, ZSTR_VAL(member), ZSTR_LEN(member));
Original file line number Diff line number Diff line change
@@ -21,27 +21,12 @@
21
21
use Php\Test\TestNamespace;
22
22
23
23
# This is not allowed, but we at least shouldn't crash.
24
-
class C extends \Google\Protobuf\Internal\Message
25
-
{
26
-
public function __construct($data = null)
27
-
{
24
+
class C extends \Google\Protobuf\Internal\Message {
25
+
public function __construct($data = null) {
28
26
parent::__construct($data);
29
27
}
30
28
}
31
29
32
-
# This is not allowed, but we at least shouldn't crash.
33
-
class TestMessageMockProxy extends TestMessage
34
-
{
35
-
public $_proxy_data = null;
36
-
37
-
public function __construct($data = null)
38
-
{
39
-
$this->_proxy_data = $data;
40
-
// bypass parent constructor
41
-
// This is common behavior by phpunit ond other mock/proxy libraries
42
-
}
43
-
}
44
-
45
30
class GeneratedClassTest extends TestBase
46
31
{
47
32
@@ -1917,38 +1902,6 @@ public function testNoSegfaultWithError()
1917
1902
new TestMessage(['optional_int32' => $this->throwIntendedException()]);
1918
1903
}
1919
1904
1920
-
public function testNoSegfaultWithContructorBypass()
1921
-
{
1922
-
if (!extension_loaded('protobuf')) {
1923
-
$this->markTestSkipped('PHP Protobuf extension is not loaded');
1924
-
}
1925
-
1926
-
$this->expectException(Exception::class);
1927
-
$this->expectExceptionMessage(
1928
-
"Couldn't find descriptor. " .
1929
-
"The message constructor was likely bypassed, resulting in an uninitialized descriptor."
1930
-
);
1931
-
1932
-
$m = new TestMessageMockProxy(['optional_int32' => 123]);
1933
-
1934
-
/**
1935
-
* At this point the message constructor was bypassed and the descriptor is not initialized.
1936
-
* This is a common PHP pattern where a proxy/mock class extends a concrete class,
1937
-
* frequently used in frameworks like PHPUnit, phpspec, and Mockery.
1938
-
*
1939
-
* When this happens, the message's internal descriptor is never initialized.
1940
-
*
1941
-
* Without proper handling, accessing properties via getters (like $this->getOptionalInt32())
1942
-
* would cause the C extension to segfault when trying to access the uninitialized descriptor.
1943
-
*
1944
-
* Instead of segfaulting, we now detect this uninitialized state and throw an exception.
1945
-
*
1946
-
* See: https://github.com/protocolbuffers/protobuf/issues/19978
1947
-
*/
1948
-
1949
-
$m->getOptionalInt32();
1950
-
}
1951
-
1952
1905
public function testNoExceptionWithVarDump()
1953
1906
{
1954
1907
$m = new Sub(['a' => 1]);
You can’t perform that action at this time.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4