diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2019-09-11 10:27:32 +0200 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-09-11 10:27:32 +0200 |
| commit | 11f3e24190fa45689c8ccaeea54a28db6752092e (patch) | |
| tree | 4bc2ed82e2fc21f7dfcfe74fd11e4208a4d8b346 /main/streams/streams.c | |
| parent | 0a24cd4e7c38d7565905152d4286ef0404d9d591 (diff) | |
| download | php-git-11f3e24190fa45689c8ccaeea54a28db6752092e.tar.gz | |
Fixed bug #78506
Diffstat (limited to 'main/streams/streams.c')
| -rw-r--r-- | main/streams/streams.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/main/streams/streams.c b/main/streams/streams.c index 566cdcde08..aef1ebe762 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -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; - - while (towrite) { - ssize_t didwrite = php_stream_write(dest, writeptr, towrite); - if (didwrite <= 0) { - *len = haveread - (didread - towrite); - return FAILURE; - } + towrite = didread; + writeptr = buf; + haveread += didread; - 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) { |
