lbarnaud Sun May 17 14:57:05 2009 UTC Added files: /php-src/ext/standard/tests/streams bug48309.phpt
Modified files: /php-src/main/streams mmap.c php_stream_mmap.h streams.c Log: Fixed bug #48309 (stream_copy_to_stream() and fpasstru() do not update stream position of plain files) http://cvs.php.net/viewvc.cgi/php-src/main/streams/mmap.c?r1=1.16&r2=1.17&diff_format=u Index: php-src/main/streams/mmap.c diff -u php-src/main/streams/mmap.c:1.16 php-src/main/streams/mmap.c:1.17 --- php-src/main/streams/mmap.c:1.16 Tue Mar 10 23:40:01 2009 +++ php-src/main/streams/mmap.c Sun May 17 14:57:05 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: mmap.c,v 1.16 2009/03/10 23:40:01 helly Exp $ */ +/* $Id: mmap.c,v 1.17 2009/05/17 14:57:05 lbarnaud Exp $ */ /* Memory Mapping interface for streams */ #include "php.h" @@ -51,6 +51,20 @@ return php_stream_set_option(stream, PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_UNMAP, NULL) == PHP_STREAM_OPTION_RETURN_OK ? 1 : 0; } +PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC) +{ + int ret = 1; + + if (php_stream_seek(stream, readden, SEEK_CUR) != 0) { + ret = 0; + } + if (php_stream_mmap_unmap(stream) == 0) { + ret = 0; + } + + return ret; +} + /* * Local variables: * tab-width: 4 http://cvs.php.net/viewvc.cgi/php-src/main/streams/php_stream_mmap.h?r1=1.10&r2=1.11&diff_format=u Index: php-src/main/streams/php_stream_mmap.h diff -u php-src/main/streams/php_stream_mmap.h:1.10 php-src/main/streams/php_stream_mmap.h:1.11 --- php-src/main/streams/php_stream_mmap.h:1.10 Tue Mar 10 23:40:01 2009 +++ php-src/main/streams/php_stream_mmap.h Sun May 17 14:57:05 2009 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_stream_mmap.h,v 1.10 2009/03/10 23:40:01 helly Exp $ */ +/* $Id: php_stream_mmap.h,v 1.11 2009/05/17 14:57:05 lbarnaud Exp $ */ /* Memory Mapping interface for streams. * The intention is to provide a uniform interface over the most common @@ -58,6 +58,8 @@ } php_stream_mmap_range; +#define PHP_STREAM_MMAP_ALL 0 + #define php_stream_mmap_supported(stream) (_php_stream_set_option((stream), PHP_STREAM_OPTION_MMAP_API, PHP_STREAM_MMAP_SUPPORTED, NULL TSRMLS_CC) == 0 ? 1 : 0) /* Returns 1 if the stream in its current state can be memory mapped, @@ -71,6 +73,9 @@ /* un-maps the last mapped range */ PHPAPI int _php_stream_mmap_unmap(php_stream *stream TSRMLS_DC); #define php_stream_mmap_unmap(stream) _php_stream_mmap_unmap((stream) TSRMLS_CC) + +PHPAPI int _php_stream_mmap_unmap_ex(php_stream *stream, off_t readden TSRMLS_DC); +#define php_stream_mmap_unmap_ex(stream, readden) _php_stream_mmap_unmap_ex((stream), (readden) TSRMLS_CC) END_EXTERN_C() /* http://cvs.php.net/viewvc.cgi/php-src/main/streams/streams.c?r1=1.184&r2=1.185&diff_format=u Index: php-src/main/streams/streams.c diff -u php-src/main/streams/streams.c:1.184 php-src/main/streams/streams.c:1.185 --- php-src/main/streams/streams.c:1.184 Sat May 16 20:22:29 2009 +++ php-src/main/streams/streams.c Sun May 17 14:57:05 2009 @@ -19,7 +19,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: streams.c,v 1.184 2009/05/16 20:22:29 lbarnaud Exp $ */ +/* $Id: streams.c,v 1.185 2009/05/17 14:57:05 lbarnaud Exp $ */ #define _GNU_SOURCE #include "php.h" @@ -1603,12 +1603,12 @@ char *p; size_t mapped; - p = php_stream_mmap_range(stream, php_stream_tell(stream), PHP_STREAM_COPY_ALL, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped); + p = php_stream_mmap_range(stream, php_stream_tell(stream), PHP_STREAM_MMAP_ALL, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped); if (p) { PHPWRITE(p, mapped); - php_stream_mmap_unmap(stream); + php_stream_mmap_unmap_ex(stream, mapped); return mapped; } @@ -1916,7 +1916,7 @@ if (p) { mapped = php_stream_write(dest, p, mapped); - php_stream_mmap_unmap(src); + php_stream_mmap_unmap_ex(src, mapped); *len = mapped; http://cvs.php.net/viewvc.cgi/php-src/ext/standard/tests/streams/bug48309.phpt?view=markup&rev=1.1 Index: php-src/ext/standard/tests/streams/bug48309.phpt +++ php-src/ext/standard/tests/streams/bug48309.phpt --TEST-- Bug #48309 (stream_copy_to_stream() and fpasstru() do not update stream position) --FILE-- <?php $tmp = tmpfile(); fwrite($tmp, b'test'); fseek($tmp, 0, SEEK_SET); echo "-- stream_copy_to_stream() --\n"; fseek($tmp, 0, SEEK_SET); stream_copy_to_stream($tmp, STDOUT, 2); echo "\n"; var_dump(stream_get_contents($tmp)); echo "-- fpassthru() --\n"; fseek($tmp, 0, SEEK_SET); fpassthru($tmp); echo "\n"; var_dump(stream_get_contents($tmp)); ?> --EXPECTF-- -- stream_copy_to_stream() -- te string(2) "st" -- fpassthru() -- test string(0) "" -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php