浏览代码

Fix memory leak when creating map field via array.

Bo Yang 7 年之前
父节点
当前提交
b140cb3145
共有 2 个文件被更改,包括 6 次插入2 次删除
  1. 1 2
      php/ext/google/protobuf/type_check.c
  2. 5 0
      php/tests/memory_leak_test.php

+ 1 - 2
php/ext/google/protobuf/type_check.c

@@ -534,8 +534,7 @@ void check_map_field(const zend_class_entry* klass, PHP_PROTO_LONG key_type,
           CACHED_PTR_TO_ZVAL_PTR((CACHED_VALUE*)value) TSRMLS_CC);
     }
 
-    Z_DELREF_P(CACHED_TO_ZVAL_PTR(map_field));
-    RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 0);
+    RETURN_ZVAL(CACHED_TO_ZVAL_PTR(map_field), 1, 1);
   } else if (Z_TYPE_P(val) == IS_OBJECT) {
     if (!instanceof_function(Z_OBJCE_P(val), map_field_type TSRMLS_CC)) {
       zend_error(E_USER_ERROR, "Given value is not an instance of %s.",

+ 5 - 0
php/tests/memory_leak_test.php

@@ -110,6 +110,11 @@ $str_arr = array();
 $m = new TestMessage();
 $m->setRepeatedString($str_arr);
 
+// Test create map field via array.
+$str_arr = array();
+$m = new TestMessage();
+$m->setMapStringString($str_arr);
+
 # $from = new TestMessage();
 # $to = new TestMessage();
 # TestUtil::setTestMessage($from);