lbarnaud Sun Apr 19 17:09:47 2009 UTC Modified files: /php-src/ext/standard file.c streamsfuncs.c /php-src/main php_streams.h /php-src/main/streams cast.c streams.c Log: Better fix for #47997
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/file.c?r1=1.541&r2=1.542&diff_format=u Index: php-src/ext/standard/file.c diff -u php-src/ext/standard/file.c:1.541 php-src/ext/standard/file.c:1.542 --- php-src/ext/standard/file.c:1.541 Sun Apr 19 13:50:24 2009 +++ php-src/ext/standard/file.c Sun Apr 19 17:09:46 2009 @@ -21,7 +21,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: file.c,v 1.541 2009/04/19 13:50:24 lbarnaud Exp $ */ +/* $Id: file.c,v 1.542 2009/04/19 17:09:46 lbarnaud Exp $ */ /* Synced with php 3.0 revision 1.218 1999-06-16 [ssb] */ @@ -661,12 +661,15 @@ } switch (Z_TYPE_P(data)) { - case IS_RESOURCE: - numchars = (int) php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL); - if ((size_t)numchars == PHP_STREAM_FAILURE) { + case IS_RESOURCE: { + size_t len; + if (php_stream_copy_to_stream_ex(srcstream, stream, PHP_STREAM_COPY_ALL, &len) != SUCCESS) { numchars = -1; + } else { + numchars = len; } break; + } case IS_ARRAY: if (zend_hash_num_elements(Z_ARRVAL_P(data))) { zval **tmp; @@ -1952,7 +1955,7 @@ deststream = php_stream_open_wrapper(dest, "wb", REPORT_ERRORS, NULL); if (srcstream && deststream) { - ret = php_stream_copy_to_stream_ex(srcstream, deststream, PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE ? FAILURE : SUCCESS; + ret = php_stream_copy_to_stream_ex(srcstream, deststream, PHP_STREAM_COPY_ALL, NULL); } if (srcstream) { php_stream_close(srcstream); http://cvs.php.net/viewvc.cgi/php-src/ext/standard/streamsfuncs.c?r1=1.137&r2=1.138&diff_format=u Index: php-src/ext/standard/streamsfuncs.c diff -u php-src/ext/standard/streamsfuncs.c:1.137 php-src/ext/standard/streamsfuncs.c:1.138 --- php-src/ext/standard/streamsfuncs.c:1.137 Sun Apr 19 13:50:24 2009 +++ php-src/ext/standard/streamsfuncs.c Sun Apr 19 17:09:46 2009 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streamsfuncs.c,v 1.137 2009/04/19 13:50:24 lbarnaud Exp $ */ +/* $Id: streamsfuncs.c,v 1.138 2009/04/19 17:09:46 lbarnaud Exp $ */ #include "php.h" #include "php_globals.h" @@ -458,7 +458,8 @@ php_stream *src, *dest; zval *zsrc, *zdest; long maxlen = PHP_STREAM_COPY_ALL, pos = 0; - size_t ret; + size_t len; + int ret; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|ll", &zsrc, &zdest, &maxlen, &pos) == FAILURE) { RETURN_FALSE; @@ -472,12 +473,12 @@ RETURN_FALSE; } - ret = php_stream_copy_to_stream_ex(src, dest, maxlen); + ret = php_stream_copy_to_stream_ex(src, dest, maxlen, &len); - if (ret == PHP_STREAM_FAILURE) { + if (ret != SUCCESS) { RETURN_FALSE; } - RETURN_LONG(ret); + RETURN_LONG(len); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/main/php_streams.h?r1=1.141&r2=1.142&diff_format=u Index: php-src/main/php_streams.h diff -u php-src/main/php_streams.h:1.141 php-src/main/php_streams.h:1.142 --- php-src/main/php_streams.h:1.141 Sun Apr 19 13:50:25 2009 +++ php-src/main/php_streams.h Sun Apr 19 17:09:46 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_streams.h,v 1.141 2009/04/19 13:50:25 lbarnaud Exp $ */ +/* $Id: php_streams.h,v 1.142 2009/04/19 17:09:46 lbarnaud Exp $ */ #ifndef PHP_STREAMS_H #define PHP_STREAMS_H @@ -525,8 +525,6 @@ * Uses mmap if the src is a plain file and at offset 0 */ #define PHP_STREAM_COPY_ALL ((size_t)-1) -#define PHP_STREAM_FAILURE ((size_t)-1) - BEGIN_EXTERN_C() ZEND_ATTRIBUTE_DEPRECATED PHPAPI size_t _php_stream_ucopy_to_stream(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC); @@ -537,12 +535,12 @@ ? _php_stream_copy_to_stream((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC) \ : _php_stream_ucopy_to_stream((src), (dest), -1, (maxlen) STREAMS_CC TSRMLS_CC) ) -PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC); -PHPAPI size_t _php_stream_copy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen STREAMS_DC TSRMLS_DC); +PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars, size_t *len STREAMS_DC TSRMLS_DC); +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); /* Preserve "characters" semantics by having maxlen refer to maxchars in a unicode context */ -#define php_stream_copy_to_stream_ex(src, dest, maxlen) ( ((src)->readbuf_type == IS_STRING) \ - ? _php_stream_copy_to_stream_ex((src), (dest), (maxlen) STREAMS_CC TSRMLS_CC) \ - : _php_stream_ucopy_to_stream_ex((src), (dest), -1, (maxlen) STREAMS_CC TSRMLS_CC) ) +#define php_stream_copy_to_stream_ex(src, dest, maxlen, len) ( ((src)->readbuf_type == IS_STRING) \ + ? _php_stream_copy_to_stream_ex((src), (dest), (maxlen), (len) STREAMS_CC TSRMLS_CC) \ + : _php_stream_ucopy_to_stream_ex((src), (dest), -1, (maxlen), (len) STREAMS_CC TSRMLS_CC) ) /* read all data from stream and put into a buffer. Caller must free buffer when done. * The copy will use mmap if available. */ http://cvs.php.net/viewvc.cgi/php-src/main/streams/cast.c?r1=1.21&r2=1.22&diff_format=u Index: php-src/main/streams/cast.c diff -u php-src/main/streams/cast.c:1.21 php-src/main/streams/cast.c:1.22 --- php-src/main/streams/cast.c:1.21 Sun Apr 19 13:50:25 2009 +++ php-src/main/streams/cast.c Sun Apr 19 17:09:47 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: cast.c,v 1.21 2009/04/19 13:50:25 lbarnaud Exp $ */ +/* $Id: cast.c,v 1.22 2009/04/19 17:09:47 lbarnaud Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -214,9 +214,9 @@ newstream = php_stream_fopen_tmpfile(); if (newstream) { - size_t copied = php_stream_copy_to_stream_ex(stream, newstream, PHP_STREAM_COPY_ALL); + int ret = php_stream_copy_to_stream_ex(stream, newstream, PHP_STREAM_COPY_ALL, NULL); - if (copied == PHP_STREAM_FAILURE) { + if (ret != SUCCESS) { php_stream_close(newstream); } else { int retcode = php_stream_cast(newstream, castas | flags, ret, show_err); @@ -332,7 +332,7 @@ (*newstream)->open_lineno = origstream->open_lineno; #endif - if (php_stream_copy_to_stream_ex(origstream, *newstream, PHP_STREAM_COPY_ALL) == PHP_STREAM_FAILURE) { + if (php_stream_copy_to_stream_ex(origstream, *newstream, PHP_STREAM_COPY_ALL, NULL) != SUCCESS) { php_stream_close(*newstream); *newstream = NULL; return PHP_STREAM_CRITICAL; http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.182&r2=1.183&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.182 php-src/main/streams/streams.c:1.183 --- php-src/main/streams/streams.c:1.182 Sun Apr 19 13:50:25 2009 +++ php-src/main/streams/streams.c Sun Apr 19 17:09:47 2009 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.182 2009/04/19 13:50:25 lbarnaud Exp $ */ +/* $Id: streams.c,v 1.183 2009/04/19 17:09:47 lbarnaud Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -1768,18 +1768,24 @@ } /* Designed for copying UChars (taking into account both maxlen and maxchars) */ -PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC) +PHPAPI size_t _php_stream_ucopy_to_stream_ex(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars, size_t *len STREAMS_DC TSRMLS_DC) { size_t haveread = 0; php_stream_statbuf ssbuf; + size_t dummy; + + if (!len) { + len = &dummy; + } if (src->readbuf_type == IS_STRING) { /* Called incorrectly, don't do that. */ - return _php_stream_copy_to_stream_ex(src, dest, maxlen STREAMS_CC TSRMLS_CC); + return _php_stream_copy_to_stream_ex(src, dest, maxlen, len STREAMS_CC TSRMLS_CC); } if (maxlen == 0 || maxchars == 0) { - return 0; + *len = 0; + return SUCCESS; } if (maxlen == PHP_STREAM_COPY_ALL) { @@ -1795,7 +1801,8 @@ && !S_ISCHR(ssbuf.sb.st_mode) #endif ) { - return 0; + *len = 0; + return SUCCESS; } } @@ -1827,7 +1834,8 @@ while(towrite) { didwrite = php_stream_write_unicode(dest, writeptr, towrite); if (didwrite == 0) { - return PHP_STREAM_FAILURE; + *len = haveread - (didread - towrite); + return FAILURE; } towrite -= didwrite; @@ -1841,41 +1849,50 @@ break; } } + + *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; } /* see _php_stream_copy_to_stream() */ ZEND_ATTRIBUTE_DEPRECATED PHPAPI size_t _php_stream_ucopy_to_stream(php_stream *src, php_stream *dest, size_t maxlen, size_t maxchars STREAMS_DC TSRMLS_DC) { - size_t ret = _php_stream_ucopy_to_stream_ex(src, dest, maxlen, maxchars STREAMS_REL_CC TSRMLS_CC); - if (ret == 0 && maxlen != 0 && maxchars != 0) { + size_t len; + int ret = _php_stream_ucopy_to_stream_ex(src, dest, maxlen, maxchars, &len STREAMS_REL_CC TSRMLS_CC); + if (ret == SUCCESS && maxlen != 0 && maxchars != 0) { return 1; } - return ret; + return len; } /* Optimized for copying octets from source stream */ -/* 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) { size_t haveread = 0; php_stream_statbuf ssbuf; + size_t dummy; + + if (!len) { + len = &dummy; + } if (src->readbuf_type == IS_UNICODE) { /* Called incorrectly, don't do that. */ - return _php_stream_ucopy_to_stream_ex(src, dest, maxlen, -1 STREAMS_CC TSRMLS_CC); + return _php_stream_ucopy_to_stream_ex(src, dest, maxlen, -1, len STREAMS_CC TSRMLS_CC); } if (maxlen == 0) { - return 0; + *len = 0; + return SUCCESS; } if (maxlen == PHP_STREAM_COPY_ALL) { @@ -1891,7 +1908,8 @@ && !S_ISCHR(ssbuf.sb.st_mode) #endif ) { - return 0; + *len = 0; + return SUCCESS; } } @@ -1905,14 +1923,16 @@ 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; } } @@ -1939,7 +1959,8 @@ while(towrite) { didwrite = php_stream_write(dest, writeptr, towrite); if (didwrite == 0) { - return PHP_STREAM_FAILURE; + *len = haveread - (didread - towrite); + return FAILURE; } towrite -= didwrite; @@ -1954,13 +1975,15 @@ } } + *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. @@ -1969,11 +1992,12 @@ 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; } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php