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:
Paul Yang 2019-08-07 13:17:20 -07:00 committed by GitHub
parent d2d6ff51a8
commit 56988bee34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 4 deletions

View File

@ -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)

View File

@ -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);
}
}