Skip to content

Commit 661cd1b

Browse files
committed
Merge branch 'PHP-8.0' into PHP-8.1
* PHP-8.0: Fixed bug #54350
2 parents fd8dfc4 + c69ffa8 commit 661cd1b

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
--TEST--
2+
Bug #54350: Memory corruption with user_filter
3+
--FILE--
4+
<?php
5+
6+
class user_filter extends php_user_filter {
7+
function filter($in, $out, &$consumed, $closing): int {
8+
while ($bucket = stream_bucket_make_writeable($in)) {
9+
}
10+
try {
11+
fclose($this->stream);
12+
} catch (TypeError $e) {
13+
echo $e->getMessage(), "\n";
14+
}
15+
return 0;
16+
}
17+
}
18+
stream_filter_register('user_filter','user_filter');
19+
$fd = fopen('php://memory','w');
20+
$filter = stream_filter_append($fd, 'user_filter');
21+
fwrite($fd, "foo");
22+
23+
?>
24+
--EXPECTF--
25+
Warning: fclose(): 5 is not a valid stream resource in %s on line %d
26+
fclose(): supplied resource is not a valid stream resource

ext/standard/user_filters.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,10 @@ php_stream_filter_status_t userfilter_filter(
155155
return ret;
156156
}
157157

158+
/* Make sure the stream is not closed while the filter callback executes. */
159+
uint32_t orig_no_fclose = stream->flags & PHP_STREAM_FLAG_NO_FCLOSE;
160+
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
161+
158162
zval *stream_prop = zend_hash_str_find_ind(Z_OBJPROP_P(obj), "stream", sizeof("stream")-1);
159163
if (stream_prop) {
160164
/* Give the userfilter class a hook back to the stream */
@@ -228,6 +232,9 @@ php_stream_filter_status_t userfilter_filter(
228232
zval_ptr_dtor(&args[1]);
229233
zval_ptr_dtor(&args[0]);
230234

235+
stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE;
236+
stream->flags |= orig_no_fclose;
237+
231238
return ret;
232239
}
233240

0 commit comments

Comments
 (0)