Skip to content

Commit c69ffa8

Browse files
committed
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fixed bug #54350
2 parents 8a08730 + 1519770 commit c69ffa8

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
@@ -169,6 +169,10 @@ php_stream_filter_status_t userfilter_filter(
169169
return ret;
170170
}
171171

172+
/* Make sure the stream is not closed while the filter callback executes. */
173+
uint32_t orig_no_fclose = stream->flags & PHP_STREAM_FLAG_NO_FCLOSE;
174+
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
175+
172176
if (!zend_hash_str_exists_ind(Z_OBJPROP_P(obj), "stream", sizeof("stream")-1)) {
173177
zval tmp;
174178

@@ -245,6 +249,9 @@ php_stream_filter_status_t userfilter_filter(
245249
zval_ptr_dtor(&args[1]);
246250
zval_ptr_dtor(&args[0]);
247251

252+
stream->flags &= ~PHP_STREAM_FLAG_NO_FCLOSE;
253+
stream->flags |= orig_no_fclose;
254+
248255
return ret;
249256
}
250257

0 commit comments

Comments
 (0)