]> granicus.if.org Git - php/commitdiff
Fix memory leak when user filter onCreate returns false
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 12 Nov 2020 11:18:33 +0000 (12:18 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 12 Nov 2020 11:18:33 +0000 (12:18 +0100)
ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt [new file with mode: 0644]
ext/standard/user_filters.c

diff --git a/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt b/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt
new file mode 100644 (file)
index 0000000..5b0c1d5
--- /dev/null
@@ -0,0 +1,24 @@
+--TEST--
+php_user_filter onCreate() returns false
+--FILE--
+<?php
+
+class my_filter extends php_user_filter {
+    function onCreate() {
+        return false;
+    }
+}
+
+stream_filter_register("my_filter", "my_filter");
+$fp = fopen('php://memory', 'rw');
+var_dump(stream_filter_append($fp, "my_filter"));
+fwrite($fp, "Test");
+fseek($fp, 0);
+var_dump(fgets($fp));
+fclose($fp);
+
+?>
+--EXPECTF--
+Warning: stream_filter_append(): Unable to create or locate filter "my_filter" in %s on line %d
+bool(false)
+string(4) "Test"
index b62e8a2d7cde9eeac43a0d60b9608e94518f804c..758f79ff112664acc5f234260468b9098fe08666 100644 (file)
@@ -342,6 +342,8 @@ static php_stream_filter *user_filter_factory_create(const char *filtername,
                        &retval,
                        0, NULL);
 
+       zval_ptr_dtor(&func_name);
+
        if (Z_TYPE(retval) != IS_UNDEF) {
                if (Z_TYPE(retval) == IS_FALSE) {
                        /* User reported filter creation error "return false;" */
@@ -359,7 +361,6 @@ static php_stream_filter *user_filter_factory_create(const char *filtername,
                }
                zval_ptr_dtor(&retval);
        }
-       zval_ptr_dtor(&func_name);
 
        /* set the filter property, this will be used during cleanup */
        ZVAL_RES(&zfilter, zend_register_resource(filter, le_userfilters));