Skip to content

Commit 11f3e24

Browse files
committed
Fixed bug #78506
1 parent 0a24cd4 commit 11f3e24

File tree

3 files changed

+47
-18
lines changed

3 files changed

+47
-18
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ PHP NEWS
2525
. Fixed bug #78510 (Partially uninitialized buffer returned by
2626
sodium_crypto_generichash_init()). (Frank Denis, cmb)
2727

28+
- Standard:
29+
. Fixed bug #78506 (Error in a php_user_filter::filter() is not reported).
30+
(Nikita)
31+
2832
05 Sep 2019, PHP 7.4.0RC1
2933

3034
- Core:
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
--TEST--
2+
Bug #78506: Error in a php_user_filter::filter() is not reported
3+
--FILE--
4+
<?php
5+
6+
class MyFilter extends php_user_filter {
7+
public function filter($in, $out, &$consumed, $closing)
8+
{
9+
stream_bucket_make_writeable($in);
10+
return PSFS_ERR_FATAL;
11+
}
12+
13+
}
14+
15+
stream_filter_register('filtername', MyFilter::class);
16+
17+
$source_resource = fopen('php://memory', 'rb+');
18+
fwrite($source_resource, 'Test data');
19+
rewind($source_resource);
20+
21+
stream_filter_prepend($source_resource,'filtername',STREAM_FILTER_READ);
22+
23+
var_dump(stream_copy_to_stream($source_resource, fopen('php://memory', 'wb')));
24+
25+
?>
26+
--EXPECT--
27+
bool(false)

main/streams/streams.c

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1586,33 +1586,31 @@ PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size
15861586
while(1) {
15871587
size_t readchunk = sizeof(buf);
15881588
ssize_t didread;
1589+
char *writeptr;
15891590

15901591
if (maxlen && (maxlen - haveread) < readchunk) {
15911592
readchunk = maxlen - haveread;
15921593
}
15931594

15941595
didread = php_stream_read(src, buf, readchunk);
1596+
if (didread <= 0) {
1597+
*len = haveread;
1598+
return didread < 0 ? FAILURE : SUCCESS;
1599+
}
15951600

1596-
if (didread > 0) {
1597-
/* extra paranoid */
1598-
char *writeptr;
1599-
1600-
towrite = didread;
1601-
writeptr = buf;
1602-
haveread += didread;
1603-
1604-
while (towrite) {
1605-
ssize_t didwrite = php_stream_write(dest, writeptr, towrite);
1606-
if (didwrite <= 0) {
1607-
*len = haveread - (didread - towrite);
1608-
return FAILURE;
1609-
}
1601+
towrite = didread;
1602+
writeptr = buf;
1603+
haveread += didread;
16101604

1611-
towrite -= didwrite;
1612-
writeptr += didwrite;
1605+
while (towrite) {
1606+
ssize_t didwrite = php_stream_write(dest, writeptr, towrite);
1607+
if (didwrite <= 0) {
1608+
*len = haveread - (didread - towrite);
1609+
return FAILURE;
16131610
}
1614-
} else {
1615-
break;
1611+
1612+
towrite -= didwrite;
1613+
writeptr += didwrite;
16161614
}
16171615

16181616
if (maxlen - haveread == 0) {

0 commit comments

Comments
 (0)