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
This commit is contained in:
parent
d2d6ff51a8
commit
56988bee34
@ -89,11 +89,13 @@ static HashTable* message_get_properties(zval* object TSRMLS_DC);
|
||||
|
||||
// Define object free method.
|
||||
PHP_PROTO_OBJECT_FREE_START(MessageHeader, message)
|
||||
if (*(void**)intern->data != NULL) {
|
||||
stringsink_uninit_opaque(*(void**)intern->data);
|
||||
FREE(*(void**)intern->data);
|
||||
if (intern->data) {
|
||||
if (*(void**)intern->data != NULL) {
|
||||
stringsink_uninit_opaque(*(void**)intern->data);
|
||||
FREE(*(void**)intern->data);
|
||||
}
|
||||
FREE(intern->data);
|
||||
}
|
||||
FREE(intern->data);
|
||||
PHP_PROTO_OBJECT_FREE_END
|
||||
|
||||
PHP_PROTO_OBJECT_DTOR_START(MessageHeader, message)
|
||||
|
@ -1504,4 +1504,27 @@ class GeneratedClassTest extends TestBase
|
||||
$m = new TestMessage();
|
||||
$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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user