diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-12 12:18:33 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-11-12 12:18:33 +0100 |
commit | 2875d0f9204122901f90072263e23e21a857b8a2 (patch) | |
tree | b8e8f5044d6c7539feba347d09f99fd4d9248c19 | |
parent | 3d2819e491aee6a504a54e15f6eafa9707a1ce67 (diff) | |
download | php-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.phpt | 24 | ||||
-rw-r--r-- | ext/standard/user_filters.c | 3 |
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)); |