]> granicus.if.org Git - php/commitdiff
fix #39125 (Memleak when reflecting non-existing class/method)
authorAntony Dovgal <tony2001@php.net>
Wed, 11 Oct 2006 15:51:17 +0000 (15:51 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 11 Oct 2006 15:51:17 +0000 (15:51 +0000)
ext/reflection/php_reflection.c
ext/reflection/tests/009.phpt [new file with mode: 0755]
ext/reflection/tests/bug39067.phpt

index 26de54bbbf75eaa9d8e70c7c0555ac34ed019362..62be24aad994a804e743e4aa913c79b0787a87ab 100644 (file)
@@ -2180,6 +2180,7 @@ ZEND_METHOD(reflection_method, __construct)
                }
                /* FIXME: Unicode support??? */
                if ((tmp = strstr(name_str.s, "::")) == NULL) {
+                       zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Invalid method name %s", name_str);
                        return;
                }
                type = IS_STRING;
@@ -2203,6 +2204,9 @@ ZEND_METHOD(reflection_method, __construct)
                        if (zend_u_lookup_class(Z_TYPE_P(classname), Z_UNIVAL_P(classname), Z_UNILEN_P(classname), &pce TSRMLS_CC) == FAILURE) {
                                zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
                                                "Class %v does not exist", Z_UNIVAL_P(classname)); 
+                               if (classname == &ztmp) {
+                                       zval_dtor(&ztmp);
+                               }
                                return;
                        }
                        ce = *pce;
@@ -2213,6 +2217,9 @@ ZEND_METHOD(reflection_method, __construct)
                        break;
 
                default:
+                       if (classname == &ztmp) {
+                               zval_dtor(&ztmp);
+                       }
                        _DO_THROW("The parameter class is expected to be either a string or an object");
                        /* returns out of this function */
        }
diff --git a/ext/reflection/tests/009.phpt b/ext/reflection/tests/009.phpt
new file mode 100755 (executable)
index 0000000..2abdcdb
--- /dev/null
@@ -0,0 +1,39 @@
+--TEST--
+ReflectionMethod::__construct() tests
+--FILE--
+<?php
+
+$a = array("", 1, "::", "a::", "::b", "a::b");
+
+foreach ($a as $val) {
+       try {
+               new ReflectionMethod($val);
+       } catch (Exception $e) {
+               var_dump($e->getMessage());
+       }
+}
+$a = array("", 1, "");
+$b = array("", "", 1);
+foreach ($a as $key=>$val) {
+       try {
+               new ReflectionMethod($val, $b[$key]);
+       } catch (Exception $e) {
+               var_dump($e->getMessage());
+       }
+}
+
+echo "Done\n";
+?>
+--EXPECTF--    
+string(20) "Invalid method name "
+string(21) "Invalid method name 1"
+string(21) "Class  does not exist"
+string(22) "Class a does not exist"
+string(21) "Class  does not exist"
+string(22) "Class a does not exist"
+string(21) "Class  does not exist"
+string(66) "The parameter class is expected to be either a string or an object"
+string(21) "Class  does not exist"
+Done
index 71e859a2c7702c0cb0828eb3d4a81dd1ad92d940..5aae08315239ad30f282c94f2019cddd851629b3 100644 (file)
@@ -47,5 +47,5 @@ Done
 unicode(1) "C"
 unicode(1) "B"
 unicode(1) "A"
-unicode(4) "Test2"
+unicode(5) "Test2"
 Done