Skip to content

Commit a2e4392

Browse files
committed
Merge branch 'PHP-7.4'
* PHP-7.4: Fixed bug #78902 Add unit test for bug #78902
2 parents 60f6235 + 6489e29 commit a2e4392

File tree

2 files changed

+37
-2
lines changed

2 files changed

+37
-2
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
--TEST--
2+
Bug #78902: Memory leak when using stream_filter_append
3+
--INI--
4+
memory_limit=512k
5+
--FILE--
6+
<?php
7+
8+
/** create temporary file 2mb file */
9+
$tmp_file_name = tempnam(sys_get_temp_dir(), 'test_');
10+
$fp = fopen($tmp_file_name, 'w+');
11+
$size = 1024 * 1024 * 2; // 2mb
12+
$chunk = 1024;
13+
while ($size > 0) {
14+
fputs($fp, str_pad('', min($chunk,$size)));
15+
$size -= $chunk;
16+
}
17+
fclose($fp);
18+
19+
$fp = fopen($tmp_file_name, 'r');
20+
stream_filter_append($fp, "string.toupper");
21+
while (!feof($fp)) {
22+
fread($fp, 1);
23+
}
24+
fclose($fp);
25+
var_dump(true);
26+
?>
27+
--EXPECT--
28+
bool(true)

main/streams/streams.c

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -588,8 +588,15 @@ PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size)
588588
* stream read buffer */
589589
while (brig_inp->head) {
590590
bucket = brig_inp->head;
591-
/* grow buffer to hold this bucket
592-
* TODO: this can fail for persistent streams */
591+
/* reduce buffer memory consumption if possible, to avoid a realloc */
592+
if (stream->readbuf && stream->readbuflen - stream->writepos < bucket->buflen) {
593+
if (stream->writepos > stream->readpos) {
594+
memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->writepos - stream->readpos);
595+
}
596+
stream->writepos -= stream->readpos;
597+
stream->readpos = 0;
598+
}
599+
/* grow buffer to hold this bucket */
593600
if (stream->readbuflen - stream->writepos < bucket->buflen) {
594601
stream->readbuflen += bucket->buflen;
595602
stream->readbuf = perealloc(stream->readbuf, stream->readbuflen,

0 commit comments

Comments
 (0)