Skip to content

Commit 6489e29

Browse files
committed
Merge branch 'PHP-7.3' into PHP-7.4
* PHP-7.3: Fixed bug #78902 Add unit test for bug #78902
2 parents 3f020ae + 67421a7 commit 6489e29

File tree

3 files changed

+40
-2
lines changed

3 files changed

+40
-2
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ PHP NEWS
3737
. Fixed bug #79115 (ReflectionClass::isCloneable call reflected class
3838
__destruct). (Nikita)
3939

40+
- Standard:
41+
. Fixed bug #78902 (Memory leak when using stream_filter_append). (liudaixiao)
42+
4043
23 Jan 2020, PHP 7.4.2
4144

4245
- Core:
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
@@ -590,8 +590,15 @@ PHPAPI int _php_stream_fill_read_buffer(php_stream *stream, size_t size)
590590
* stream read buffer */
591591
while (brig_inp->head) {
592592
bucket = brig_inp->head;
593-
/* grow buffer to hold this bucket
594-
* TODO: this can fail for persistent streams */
593+
/* reduce buffer memory consumption if possible, to avoid a realloc */
594+
if (stream->readbuf && stream->readbuflen - stream->writepos < bucket->buflen) {
595+
if (stream->writepos > stream->readpos) {
596+
memmove(stream->readbuf, stream->readbuf + stream->readpos, stream->writepos - stream->readpos);
597+
}
598+
stream->writepos -= stream->readpos;
599+
stream->readpos = 0;
600+
}
601+
/* grow buffer to hold this bucket */
595602
if (stream->readbuflen - stream->writepos < bucket->buflen) {
596603
stream->readbuflen += bucket->buflen;
597604
stream->readbuf = perealloc(stream->readbuf, stream->readbuflen,

0 commit comments

Comments
 (0)