diff options
| author | Arnaud Le Blanc <lbarnaud@php.net> | 2009-04-19 17:10:35 +0000 |
|---|---|---|
| committer | Arnaud Le Blanc <lbarnaud@php.net> | 2009-04-19 17:10:35 +0000 |
| commit | 8ea9eb8560c02818a06369cdc33a2b2367964526 (patch) | |
| tree | 03fd524b7e30fa1516596e2025bc7e29338c3211 /main/streams/streams.c | |
| parent | bd7f4375a3dabf883fe1f018a89d07a39ae36af5 (diff) | |
| download | php-git-8ea9eb8560c02818a06369cdc33a2b2367964526.tar.gz | |
MFH: Better fix for #47997
Diffstat (limited to 'main/streams/streams.c')
| -rwxr-xr-x | main/streams/streams.c | 37 |
1 files changed, 25 insertions, 12 deletions
diff --git a/main/streams/streams.c b/main/streams/streams.c index c5aebe7812..def2acec3d 100755 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -1297,17 +1297,23 @@ PHPAPI size_t _php_stream_copy_to_mem(php_stream *src, char **buf, size_t maxlen return len; } -/* Returns the number of bytes moved, or PHP_STREAM_FAILURE on failure. */ -PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC TSRMLS_DC) +/* Returns SUCCESS/FAILURE and sets *len to the number of bytes moved */ +PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t *len STREAMS_DC TSRMLS_DC) { char buf[CHUNK_SIZE]; size_t readchunk; size_t haveread = 0; size_t didread; + size_t dummy; php_stream_statbuf ssbuf; + if (!len) { + len = &dummy; + } + if (maxlen == 0) { - return 0; + *len = 0; + return SUCCESS; } if (maxlen == PHP_STREAM_COPY_ALL) { @@ -1323,7 +1329,8 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s && !S_ISCHR(ssbuf.sb.st_mode) #endif ) { - return 0; + *len = 0; + return SUCCESS; } } @@ -1337,14 +1344,16 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s mapped = php_stream_write(dest, p, mapped); php_stream_mmap_unmap(src); + + *len = mapped; /* we've got at least 1 byte to read. * less than 1 is an error */ if (mapped > 0) { - return mapped; + return SUCCESS; } - return PHP_STREAM_FAILURE; + return FAILURE; } } @@ -1369,7 +1378,8 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s while(towrite) { didwrite = php_stream_write(dest, writeptr, towrite); if (didwrite == 0) { - return PHP_STREAM_FAILURE; + *len = haveread - (didread - towrite); + return FAILURE; } towrite -= didwrite; @@ -1384,13 +1394,15 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s } } + *len = haveread; + /* we've got at least 1 byte to read. * less than 1 is an error */ if (haveread > 0) { - return haveread; + return SUCCESS; } - return PHP_STREAM_FAILURE; + return FAILURE; } /* Returns the number of bytes moved. @@ -1399,11 +1411,12 @@ PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, s ZEND_ATTRIBUTE_DEPRECATED PHPAPI size_t _php_stream_copy_to_stream(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC TSRMLS_DC) { - size_t ret = _php_stream_copy_to_stream_ex(src, dest, maxlen STREAMS_REL_CC TSRMLS_CC); - if (ret == 0 && maxlen != 0) { + size_t len; + int ret = _php_stream_copy_to_stream_ex(src, dest, maxlen, &len STREAMS_REL_CC TSRMLS_CC); + if (ret == SUCCESS && len == 0 && maxlen != 0) { return 1; } - return ret; + return len; } /* }}} */ |
