summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-11-12 12:18:33 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-11-12 12:18:33 +0100
commit2875d0f9204122901f90072263e23e21a857b8a2 (patch)
treeb8e8f5044d6c7539feba347d09f99fd4d9248c19
parent3d2819e491aee6a504a54e15f6eafa9707a1ce67 (diff)
downloadphp-git-2875d0f9204122901f90072263e23e21a857b8a2.tar.gz
Fix memory leak when user filter onCreate returns false
-rw-r--r--ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt24
-rw-r--r--ext/standard/user_filters.c3
2 files changed, 26 insertions, 1 deletions
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
index 0000000000..5b0c1d5d9c
--- /dev/null
+++ b/ext/standard/tests/filters/php_user_filter_onCreate_failure.phpt
@@ -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"
diff --git a/ext/standard/user_filters.c b/ext/standard/user_filters.c
index b62e8a2d7c..758f79ff11 100644
--- a/ext/standard/user_filters.c
+++ b/ext/standard/user_filters.c
@@ -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));