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
pull/6484/head
Paul Yang 6 years ago committed by GitHub
parent d2d6ff51a8
commit 56988bee34
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      php/ext/google/protobuf/message.c
  2. 23
      php/tests/generated_class_test.php

@ -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…
Cancel
Save