Unverified Commit 56988bee authored by Paul Yang's avatar Paul Yang Committed by GitHub

No free when construct was not done (#6483)

* No free when construct was not done

This fix the segfault when some other error happens

* Add more tests

* Use Sub to avoid printing too much
parent d2d6ff51
...@@ -89,11 +89,13 @@ static HashTable* message_get_properties(zval* object TSRMLS_DC); ...@@ -89,11 +89,13 @@ static HashTable* message_get_properties(zval* object TSRMLS_DC);
// Define object free method. // Define object free method.
PHP_PROTO_OBJECT_FREE_START(MessageHeader, message) PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
if (intern->data) {
if (*(void**)intern->data != NULL) { if (*(void**)intern->data != NULL) {
stringsink_uninit_opaque(*(void**)intern->data); stringsink_uninit_opaque(*(void**)intern->data);
FREE(*(void**)intern->data); FREE(*(void**)intern->data);
} }
FREE(intern->data); FREE(intern->data);
}
PHP_PROTO_OBJECT_FREE_END PHP_PROTO_OBJECT_FREE_END
PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message) PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message)
......
...@@ -1504,4 +1504,27 @@ class GeneratedClassTest extends TestBase ...@@ -1504,4 +1504,27 @@ class GeneratedClassTest extends TestBase
$m = new TestMessage(); $m = new TestMessage();
$m->setOptionalString($values[0]); $m->setOptionalString($values[0]);
} }
#########################################################
# Test no segfault when error happens
#########################################################
function throwIntendedException()
{
throw new Exception('Intended');
}
/**
* @expectedException Exception
*/
public function testNoSegfaultWithError()
{
new TestMessage(['optional_int32' => $this->throwIntendedException()]);
}
public function testNoExceptionWithVarDump()
{
$m = new Sub(['a' => 1]);
var_dump($m);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment