@@ -1489,7 +1489,7 @@ PHPAPI zend_string *_php_stream_copy_to_mem(php_stream *src, size_t maxlen, int
1489
1489
{
1490
1490
ssize_t ret = 0 ;
1491
1491
char * ptr ;
1492
- size_t len = 0 , max_len ;
1492
+ size_t len = 0 , buflen ;
1493
1493
int step = CHUNK_SIZE ;
1494
1494
int min_room = CHUNK_SIZE / 4 ;
1495
1495
php_stream_statbuf ssbuf ;
@@ -1503,7 +1503,7 @@ PHPAPI zend_string *_php_stream_copy_to_mem(php_stream *src, size_t maxlen, int
1503
1503
maxlen = 0 ;
1504
1504
}
1505
1505
1506
- if (maxlen > 0 ) {
1506
+ if (maxlen > 0 && maxlen < 4 * CHUNK_SIZE ) {
1507
1507
result = zend_string_alloc (maxlen , persistent );
1508
1508
ptr = ZSTR_VAL (result );
1509
1509
while ((len < maxlen ) && !php_stream_eof (src )) {
@@ -1537,20 +1537,30 @@ PHPAPI zend_string *_php_stream_copy_to_mem(php_stream *src, size_t maxlen, int
1537
1537
* by a downsize of the buffer, overestimate by the step size (which is
1538
1538
* 8K). */
1539
1539
if (php_stream_stat (src , & ssbuf ) == 0 && ssbuf .sb .st_size > 0 ) {
1540
- max_len = MAX (ssbuf .sb .st_size - src -> position , 0 ) + step ;
1540
+ buflen = MAX (ssbuf .sb .st_size - src -> position , 0 ) + step ;
1541
+ if (maxlen > 0 && buflen > maxlen ) {
1542
+ buflen = maxlen ;
1543
+ }
1541
1544
} else {
1542
- max_len = step ;
1545
+ buflen = step ;
1543
1546
}
1544
1547
1545
- result = zend_string_alloc (max_len , persistent );
1548
+ result = zend_string_alloc (buflen , persistent );
1546
1549
ptr = ZSTR_VAL (result );
1547
1550
1548
1551
// TODO: Propagate error?
1549
- while ((ret = php_stream_read (src , ptr , max_len - len )) > 0 ){
1552
+ while ((ret = php_stream_read (src , ptr , buflen - len )) > 0 ) {
1550
1553
len += ret ;
1551
- if (len + min_room >= max_len ) {
1552
- result = zend_string_extend (result , max_len + step , persistent );
1553
- max_len += step ;
1554
+ if (len + min_room >= buflen ) {
1555
+ if (maxlen == len ) {
1556
+ break ;
1557
+ }
1558
+ if (maxlen > 0 && buflen + step > maxlen ) {
1559
+ buflen = maxlen ;
1560
+ } else {
1561
+ buflen += step ;
1562
+ }
1563
+ result = zend_string_extend (result , buflen , persistent );
1554
1564
ptr = ZSTR_VAL (result ) + len ;
1555
1565
} else {
1556
1566
ptr += ret ;
0 commit comments