Skip to content

Commit 2875d0f

Browse files
committed
Fix memory leak when user filter onCreate returns false
1 parent 3d2819e commit 2875d0f

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
php_user_filter onCreate() returns false
3+
--FILE--
4+
<?php
5+
6+
class my_filter extends php_user_filter {
7+
function onCreate() {
8+
return false;
9+
}
10+
}
11+
12+
stream_filter_register("my_filter", "my_filter");
13+
$fp = fopen('php://memory', 'rw');
14+
var_dump(stream_filter_append($fp, "my_filter"));
15+
fwrite($fp, "Test");
16+
fseek($fp, 0);
17+
var_dump(fgets($fp));
18+
fclose($fp);
19+
20+
?>
21+
--EXPECTF--
22+
Warning: stream_filter_append(): Unable to create or locate filter "my_filter" in %s on line %d
23+
bool(false)
24+
string(4) "Test"

ext/standard/user_filters.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,8 @@ static php_stream_filter *user_filter_factory_create(const char *filtername,
342342
&retval,
343343
0, NULL);
344344

345+
zval_ptr_dtor(&func_name);
346+
345347
if (Z_TYPE(retval) != IS_UNDEF) {
346348
if (Z_TYPE(retval) == IS_FALSE) {
347349
/* User reported filter creation error "return false;" */
@@ -359,7 +361,6 @@ static php_stream_filter *user_filter_factory_create(const char *filtername,
359361
}
360362
zval_ptr_dtor(&retval);
361363
}
362-
zval_ptr_dtor(&func_name);
363364

364365
/* set the filter property, this will be used during cleanup */
365366
ZVAL_RES(&zfilter, zend_register_resource(filter, le_userfilters));

0 commit comments

Comments
 (0)