This commit is contained in:
Nikita Popov 2019-09-11 10:27:32 +02:00
parent 0a24cd4e7c
commit 11f3e24190
3 changed files with 47 additions and 18 deletions

4
NEWS
View file

@ -25,6 +25,10 @@ PHP NEWS
. Fixed bug #78510 (Partially uninitialized buffer returned by
sodium_crypto_generichash_init()). (Frank Denis, cmb)
- Standard:
. Fixed bug #78506 (Error in a php_user_filter::filter() is not reported).
(Nikita)
05 Sep 2019, PHP 7.4.0RC1
- Core:

View file

@ -0,0 +1,27 @@
--TEST--
Bug #78506: Error in a php_user_filter::filter() is not reported
--FILE--
<?php
class MyFilter extends php_user_filter {
public function filter($in, $out, &$consumed, $closing)
{
stream_bucket_make_writeable($in);
return PSFS_ERR_FATAL;
}
}
stream_filter_register('filtername', MyFilter::class);
$source_resource = fopen('php://memory', 'rb+');
fwrite($source_resource, 'Test data');
rewind($source_resource);
stream_filter_prepend($source_resource,'filtername',STREAM_FILTER_READ);
var_dump(stream_copy_to_stream($source_resource, fopen('php://memory', 'wb')));
?>
--EXPECT--
bool(false)

View file

@ -1586,33 +1586,31 @@ PHPAPI int _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size
while(1) {
size_t readchunk = sizeof(buf);
ssize_t didread;
char *writeptr;
if (maxlen && (maxlen - haveread) < readchunk) {
readchunk = maxlen - haveread;
}
didread = php_stream_read(src, buf, readchunk);
if (didread <= 0) {
*len = haveread;
return didread < 0 ? FAILURE : SUCCESS;
}
if (didread > 0) {
/* extra paranoid */
char *writeptr;
towrite = didread;
writeptr = buf;
haveread += didread;
towrite = didread;
writeptr = buf;
haveread += didread;
while (towrite) {
ssize_t didwrite = php_stream_write(dest, writeptr, towrite);
if (didwrite <= 0) {
*len = haveread - (didread - towrite);
return FAILURE;
}
towrite -= didwrite;
writeptr += didwrite;
while (towrite) {
ssize_t didwrite = php_stream_write(dest, writeptr, towrite);
if (didwrite <= 0) {
*len = haveread - (didread - towrite);
return FAILURE;
}
} else {
break;
towrite -= didwrite;
writeptr += didwrite;
}
if (maxlen - haveread == 0) {