aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBo Yang <teboring@google.com>2017-12-05 16:44:19 -0800
committerBo Yang <teboring@google.com>2017-12-06 10:38:18 -0800
commit3b7a5f451546888ad96aaa143ef86fea904a03ec (patch)
treeb0ed22f963a6caaf360424bcdf14f078f051d312
parent7d3437152ad420d4382b883f0a52a86526166ef5 (diff)
downloadprotobuf-3b7a5f451546888ad96aaa143ef86fea904a03ec.tar.gz
protobuf-3b7a5f451546888ad96aaa143ef86fea904a03ec.tar.bz2
protobuf-3b7a5f451546888ad96aaa143ef86fea904a03ec.zip
Fix several more memory leak
-rw-r--r--php/ext/google/protobuf/def.c1
-rw-r--r--php/ext/google/protobuf/message.c8
-rw-r--r--php/ext/google/protobuf/type_check.c1
-rw-r--r--php/tests/memory_leak_test.php23
4 files changed, 27 insertions, 6 deletions
diff --git a/php/ext/google/protobuf/def.c b/php/ext/google/protobuf/def.c
index 13f7cdd6..55291e23 100644
--- a/php/ext/google/protobuf/def.c
+++ b/php/ext/google/protobuf/def.c
@@ -249,6 +249,7 @@ PHP_METHOD(Descriptor, getField) {
MAKE_STD_ZVAL(field_hashtable_value);
ZVAL_OBJ(field_hashtable_value, field_descriptor_type->create_object(
field_descriptor_type TSRMLS_CC));
+ Z_DELREF_P(field_hashtable_value);
#else
field_hashtable_value =
field_descriptor_type->create_object(field_descriptor_type TSRMLS_CC);
diff --git a/php/ext/google/protobuf/message.c b/php/ext/google/protobuf/message.c
index 3fce2c17..b11c7215 100644
--- a/php/ext/google/protobuf/message.c
+++ b/php/ext/google/protobuf/message.c
@@ -374,7 +374,7 @@ PHP_METHOD(Message, whichOneof) {
LOWER_FIELD) \
PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
zval member; \
- PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
+ PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \
PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
zval* value = message_get_property_internal(getThis(), &member TSRMLS_CC); \
PHP_PROTO_FAKE_SCOPE_END; \
@@ -387,7 +387,7 @@ PHP_METHOD(Message, whichOneof) {
return; \
} \
zval member; \
- PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
+ PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \
message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
PHP_PROTO_RETVAL_ZVAL(getThis()); \
}
@@ -396,7 +396,7 @@ PHP_METHOD(Message, whichOneof) {
LOWER_FIELD) \
PHP_METHOD(UPPER_CLASS, get##UPPER_FIELD) { \
zval member; \
- PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
+ PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \
PHP_PROTO_FAKE_SCOPE_BEGIN(LOWER_CLASS##_type); \
message_get_oneof_property_internal(getThis(), &member, \
return_value TSRMLS_CC); \
@@ -409,7 +409,7 @@ PHP_METHOD(Message, whichOneof) {
return; \
} \
zval member; \
- PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 1); \
+ PHP_PROTO_ZVAL_STRING(&member, LOWER_FIELD, 0); \
message_set_property_internal(getThis(), &member, value TSRMLS_CC); \
PHP_PROTO_RETVAL_ZVAL(getThis()); \
}
diff --git a/php/ext/google/protobuf/type_check.c b/php/ext/google/protobuf/type_check.c
index 37171426..85f5051e 100644
--- a/php/ext/google/protobuf/type_check.c
+++ b/php/ext/google/protobuf/type_check.c
@@ -532,6 +532,7 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type,
map_field_handlers->write_dimension(
CACHED_TO_ZVAL_PTR(map_field), &key,
CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC);
+ zval_dtor(&key);
}
RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1);
diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php
index 772b466f..29ca7787 100644
--- a/php/tests/memory_leak_test.php
+++ b/php/tests/memory_leak_test.php
@@ -106,15 +106,34 @@ $m->mergeFromString(hex2bin('F80601'));
assert('F80601', bin2hex($m->serializeToString()));
// Test create repeated field via array.
-$str_arr = array();
+$str_arr = array("abc");
$m = new TestMessage();
$m->setRepeatedString($str_arr);
// Test create map field via array.
-$str_arr = array();
+$str_arr = array("abc"=>"abc");
$m = new TestMessage();
$m->setMapStringString($str_arr);
+// Test unset
+$from = new TestMessage();
+TestUtil::setTestMessage($from);
+unset($from);
+
+// Test wellknown
+$from = new \Google\Protobuf\Timestamp();
+$from->setSeconds(1);
+assert(1, $from->getSeconds());
+
+$from = new \Google\Protobuf\Value();
+$from->setNumberValue(1);
+assert(1, $from->getNumberValue());
+
+// Test descriptor
+$pool = \Google\Protobuf\DescriptorPool::getGeneratedPool();
+$desc = $pool->getDescriptorByClassName("\Foo\TestMessage");
+$field = $desc->getField(1);
+
# $from = new TestMessage();
# $to = new TestMessage();
# TestUtil::setTestMessage($from);